回答:
query_posts()
は非常に単純化されており、ページのメインクエリをクエリの新しいインスタンスに置き換えることにより、ページのメインクエリを変更する問題の多い方法です。これは非効率的で(SQLクエリを再実行します)、状況によっては完全に失敗します(特に投稿のページネーションを処理する場合は特にそうです)。pre_get_posts
この目的のために、最新のWPコードでは、フックを使用するなど、より信頼性の高い方法を使用する必要があります。TL; DR はquery_posts()を決して使用しません。
get_posts()
使用法は非常に似ており、同じ引数を受け入れます(異なるデフォルトなど、いくつかのニュアンスがあります)が、投稿の配列を返し、グローバル変数を変更せず、どこでも安全に使用できます。
WP_Query
は、両方の背後で動作するクラスですが、独自のインスタンスを作成して操作することもできます。もう少し複雑で、制限が少なく、どこでも安全に使用できます。
query_posts()
用の小さなラッパー関数であるWP_Query
、グローバル上書きされ、それは(フローチャートに従って)ないだけ余分なもの$wp_query
query_posts()
てWP_Query
もパフォーマンスに違いはありません。元のページのクエリはコアロードの一部であるため、引き続き実行されます。テンプレートファイルにループがまったくない場合でも、これらのクエリは実行されます。
query_posts
はまったく変更されず、既に実行された後に置換されます。メインループを変更する最良の方法は、pre_get_posts
フィルターを使用することです。 developer.wordpress.com/2012/05/14/...
query_posts
-絶対に使用しないでくださいquery_posts
。@Rarstが言ったこととは別に、本当に大きな問題query_posts
は、メインクエリオブジェクト(に格納されている$wp_query
)を壊すことです。多くのプラグインとカスタムコードはメインクエリオブジェクトに依存しているため、メインクエリオブジェクトを壊すことは、プラグインとカスタムコードの機能を壊すことを意味します。そのような関数の1つはすべて重要なページネーション関数です。したがって、メインクエリを中断すると、ページネーションが中断されます。
どの程度悪いかを証明するにquery_posts
は、任意のテンプレートで次のことを行い、結果を比較します
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
そしてWP_Query
、関連する投稿、スライダー、注目コンテンツ、静的フロントページのコンテンツなどの二次クエリを構築する正しい方法です。ホームページ、単一ページ、または任意の種類のアーカイブページのメインクエリを優先して、ページの機能を損なうため、2つのうちいずれも使用しないでください。メインクエリを変更する必要がある場合は、カスタムクエリではなく、そのために使用します。(更新:静的フロントページおよびトゥルーページについては、トゥルーページおよび静的フロントページでのpre_get_postsの使用を参照してください*)pre_get_posts
本質的に、WP_Query
はメインクエリで使用されget_posts
、でも使用されますが、をget_posts()
使用しますWP_Query
が、いくつかの違いがあります
get_posts
よりも高速ですWP_Query
。マージンは、サイトの総投稿数によって異なります。この理由は、デフォルトでページネーションをスキップ/合法的に中断するget_posts
パス'no_found_rows' => true
ですWP_Query
。で'no_found_rows' => true
、WP_Query
クエリされた投稿の量を取得してから削除します。デフォルトでは、ページネーションを計算するために、クエリに一致するすべての投稿をさらに検索します。
このため、get_posts()
ページ分割されていないクエリにのみ使用する必要があります。ページネーションget_posts
は本当に大きな混乱です。WP_Query
ページ分割されたすべてのクエリに使用する必要があります
get_posts()
これらのフィルターの影響を受けるposts_*
フィルターの影響を受けませんWP_Query
。その理由はget_posts
、デフォルトでは'suppress_filters' => true
、WP_Query
get_posts
以下のような追加パラメータのカップルを持ってinclude
、exclude
、numberposts
とcategory
。これらのパラメータは、WP_Query
に渡される前に有効なパラメータに変更されますWP_Query
。include
変更されますpost__in
、exclude
にpost__not_in
、category
にcat
やnumberposts
にposts_per_page
。に注意してください、に渡すことができるすべてのパラメータはでWP_Query
動作しget_posts
ますが、無視してデフォルトのパラメータを使用することはできませんget_posts
get_posts
while の$posts
プロパティのみWP_Query
をWP_Query
返し、オブジェクト全体を返します。このオブジェクトは、ループ内で使用できる条件、ページネーション、その他の有用な情報に関して非常に便利です。
get_posts
はループを使用しませんが、foreach
投稿を表示するループです。また、デフォルトではテンプレートタグは使用できません。setup_postdata( $post )
テンプレートタグを利用可能にするために使用する必要があります。WP_Query
ループを使用し、テンプレートタグはデフォルトで使用可能
get_posts
合格'ignore_sticky_posts' => 1
にWP_Query
なるよう、get_posts
デフォルトでスティッキーポストを無視
使用するかどうか、以上を踏まえget_posts
かWP_Query
はあなた次第ですし、実際にクエリから何が必要なのです。上記はあなたの選択であなたを導くべきです
基本的な違いは、query_posts()
実際には現在のループを変更することだけです。完了したら、ループをリセットし、陽気な方法でループを送信する必要があります。このメソッドは、「クエリ」が基本的に関数に渡すURL文字列であるため、次のように理解するのも少し簡単です。
query_posts('meta_key=color&meta_value=blue');
一方、WP_Query
は汎用ツールであり、MySQLクエリを直接作成するようなものquery_posts()
です。また、(ループ内だけでなく)どこでも使用でき、現在実行中の投稿クエリに干渉しません。
私はWP_Query
それが起こるように、より頻繁に使用する傾向があります。本当に、それはあなたの特定のケースに帰着するでしょう。
単に使用する必要はありませんquery_posts()
。新しいWP_Queryオブジェクトをインスタンス化し、その新しいオブジェクトをに再割り当てするだけglobal wp_query
です。
参考までに、以下はその実際のquery_posts()
機能です。
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
詳細なカスタムクエリスクリプトを作成する場合は、独自のWP_Queryオブジェクトをインスタンス化します。または、get_posts()
あちこちで軽い操作をするだけでよい場合に使用します。
どちらの場合でも、私は自分自身に恩恵を与えwp_includes/query.php
、WP_Query
クラスに行って熟読することを強くお勧めします。
他のクエリ結果にも影響wp_reset_query()
するquery_posts()
ため、使用後に必ず使用してください 。