質問: wp_query()、query_posts()、およびpre_get_postsを使用する場合 私は読みます @ nacin's あなたはquery - を知らない 昨日、ちょっと質問しているうさぎの穴を送りました。昨日の前に、私は(間違って) query_posts() を私のすべての問い合わせの必要性のために使っていました。今、私は wp_query() を使うことについて少し賢いですが、それでもまだいくつかの灰色の領域があります。 私が確実に知っていると思うこと: ページ上の任意の場所(サイドバー、フッター、任意の種類の「関連記事」など)で追加ループを作成している場合は、 wp_query() を使用します。私は何の問題もなく単一のページでそれを繰り返し使用することができます。 (右?)。 確実にわからないこと @ nacinの pre_get_posts と wp_query() の組み合わせはいつですか。今はすべてに pre_get_posts を使うべきですか? テンプレートページのループを変更したい場合 - 分類アーカイブページを変更したいとしましょう - if have_posts : while have_posts : the_post部分を削除して自分の wp_query() を書くのですか?それとも、functions.phpファイルで pre_get_posts を使用して出力を変更しますか? tl; dr これから導きたいtl; drの規則は次のとおりです。 query_posts もう使用しない 1ページで複数のクエリを実行する場合は、 wp_query() を使用してください。 ループを修正するときは、これを__________________してください。 知恵をありがとうテリーps:私は見て読んだことがあります: あなたはいつwp_queryとquery_posts()とget_posts()を使うべきですか? これは別の次元を追加します - get_posts 。しかし、 pre_get_posts はまったく扱いません。
回答: ループには2つの異なるコンテキストがあります。 main ループはurl要求に基づいて行われ、テンプレートがロードされる前に処理されます。 secondary テンプレートファイルから呼び出されるなど、他の方法で発生する/その他のループ query_posts()の問題は、それが主ループになろうとしていて惨めに失敗するのが二次ループであるということです。したがって、それが存在することを忘れてください。メインループを修正する query_posts()を使わない $query->is_main_query()チェックでpre_get_postsフィルターを使う 代わりにrequestフィルタを使用してください(少し粗すぎるので上記のほうが良いです)。 二次ループを実行するほぼ互換性のあるnew wp_queryまたはget_posts()を使用してください(後者は前者の薄いラッパーです)。そうじするwp_reset_query()を使用した場合、またはグローバル$wp_queryと直接混同した場合は、query_posts()を使用してください。そうする必要はほとんどありません。wp_reset_postdata()またはthe_post()を使用しているか、グローバル$postと混同していて、投稿関連のものの初期状態を復元する必要がある場合は、setup_postdata()を使用してください。