の場合はご利用WP_Query vs query_posts()vs get_posts()?
-
16-10-2019 - |
質問
もう半分のチュートリアル コーデックス 周囲には謎の生命体の利用 query_posts()
半利用 WP_Query
.も読みました。
解決
query_posts()
は過度な単純化は、問題を修正の主なクエリーのページで置き換えられることにより、新しいインスタンスを返します。非効率で再行するSQL文)国債なように、特定の状況下では特に多くの処理時の投稿ページング).他の近代的なコードを使うべき信頼性の高い方法などを活用しpre_get_posts
フックです。TL;DR なquery_posts()ま.get_posts()
この使用を受け入れ同じ引数である微妙なニュアンスのように異なるデフォルト)の配列を返します投稿を変えないときはグローバル変数と安心してお使いいただけます。WP_Query
のクラスとしても舞台裏を作成することもでき、仕事を自分のインスタンスです。少し複雑化、少人数制限も安全に使用します。
他のヒント
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()
Paginated非パギン化クエリのみに使用する必要があります。ページング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
ただ返します$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);
}
In Depth Customクエリスクリプトを作成する場合は、独自のwp_queryオブジェクトをインスタンス化します。または使用します get_posts()
あなたがする必要があるのは、あちこちで軽い操作だけです。
どちらの場合でも、私は自分自身に好意を与えて行くことを強くお勧めします wp_includes/query.php
と熟読します WP_Query
クラス。
必ず使用してください wp_reset_query()
使用した後 query_posts()
他のクエリの結果にも影響するためです。
正しく読んでいることを覚えているなら、本質的に「ループ」がやっています WP_Query
コアファイルでは、理解しやすい方法です。
- query_posts():メインクエリを変更する必要がある場合は、1つのケースで使用される場合があります。多くのグローバル変数を設定します。
- get_posts():それはメカニズムが非常に似ており、同じ引数を受け入れますが、投稿の配列を返します
- wp_query:自分のオブジェクトを作成して作業することができます。もう少し複雑で、制限が少ないため、どこでも安全です。
私は使わないと言います get_posts()
プラグインで。場合によっては非常に制限的なフィルターを課します(セットは suppress_filters
, ignore_sticky_posts
, など)そして、おそらく何かをすばやくしたいときにのみテーマで使用する必要があります。