web-dev-qa-db-ja.com

WP_Queryでpre_get_postsを使用する

WP_query()query_posts()およびpre_get_postsの使用に関して、 この質問 に対する Stephen Harris の優れた回答を読んでいました。

"pre_get_postsはanyクエリを変更するためのフィルタです。「メインクエリ」のみを変更するためによく使用されます。」

onlypre_get_postsで作成された特定の2次照会をフィルタリングするために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();

任意の助けは大歓迎です。

22
Ben Pearson

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

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();

_編集_

あなたが使うことができるもう一つのテクニックはあなた自身のquery varをセットしてフックでそれをチェックすることです:

// 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 );
23
Milo

pre_get_postsはすべての投稿クエリに対して起動します。

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

- @ナシン

あなたがあなたのフィルタを除外しない限りそれが言われているので、条件を使用してください:is_main_query()そしてあなたのフィルタはあなたの新しいWP_Queryで起動します。

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

4
Chris_O