WP_Queryでpre_get_postsを使用する


24

私は読んでいたスティーブン・ハリスへの優れた答えをこの質問の使用に関してWP_query()query_posts()pre_get_posts

彼が言う「pre_get_postsを変更するためのフィルタであり、任意のクエリを。それはほとんどの場合のみ『メインクエリ』を変更するために使用されています。」

?で作成された特定のセカンダリクエリのみpre_get_postsをフィルタリングするために使用できます。例えば。WP_Query

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

助けていただければ幸いです。

回答:


23

最も簡単な方法は、クエリの直前にアクションを追加し、直後に削除することです。

add_action('pre_get_posts', 'some_function_in_functionsphp');
$my_secondary_loop = new WP_Query(...);
remove_action('pre_get_posts', 'some_function_in_functionsphp');

if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

編集

使用できる別の手法は、独自のクエリ変数を設定し、フックでそれを確認することです。

// tell WordPress about our new query var
function wpse52480_query_vars( $query_vars ){
    $query_vars[] = 'my_special_query';
    return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );

// check if our query var is set in any query
function wpse52480_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_special_query'] ) )
        // do special stuff

    return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );

そしてテンプレートで:

// set the query var (along with whatever others) to trigger the filter
$args = array(
    'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );

どうもありがとう、ミロ。これは本当に便利です。独自のクエリ変数を設定することは可能かどうかといつも思っていました。
ベンピアソン

このトリックをアーカイブページに使用するにはどうすればよいですか?アーカイブページのクエリ全体を再度書き換えたくないのですが、この手法を使用したいです。
ロヒトパンデ

4

pre_get_posts すべての投稿クエリに対して発生します:

  • get_posts()
  • 新しいWP_Query()
  • そのランダムな最近の投稿は、知らないうちにクライアントがインストールしたウィジェットです。
  • すべて

-@nacin

フィルターを除外しない限り、条件付き:を使用するis_main_query()と、新しいWP_Queryでフィルターが起動します。

特定の新しいWP_Queryのみをターゲットにしたい場合、それを行う方法はありません。


ミロのテクニックはどうですか?私はそれを見たことがありません
...-ブラソフィロ

彼のテクニックは機能します。Iveはpre_get_postsに使用したことはありませんが、posts_whereなどの他のフィルターには使用しています
Chris_O

1
今日は新しいことを学びました!
ブラソフィロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.