質問

もう半分のチュートリアル コーデックス 周囲には謎の生命体の利用 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_postsWP_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' => trueWP_Query

  • get_posts 次のような追加のパラメーターがいくつかあります include, exclude, numberpostscategory. 。これらのパラメーターは、有効なパラメーターに変更されます WP_Query 渡される前に WP_Query. include に変更されます post__in, exclude の中へ post__not_in, category の中へ catnumberposts の中へ 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' => 1WP_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, など)そして、おそらく何かをすばやくしたいときにのみテーマで使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません wordpress.stackexchange
scroll top