Использование pre_get_posts с WP_Query

24

Я читал Стивен Харрис отличный ответ «s на этот вопрос в отношении использования 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();

РЕДАКТИРОВАТЬ

Другой метод, который вы можете использовать, - установить собственный запрос 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 );
Milo
источник
Большое спасибо, Майло. Это действительно очень полезно. Я всегда задавался вопросом, можно ли было задать свой собственный запрос var.
Бен Пирсон
Как я могу использовать этот трюк для страницы архива? Я не хочу переписывать весь запрос снова для страницы архива, но хочу использовать эту технику.
Рохит Панде
4

pre_get_posts срабатывает для каждого почтового запроса:

  • get_posts ()
  • новый WP_Query ()
  • Этот случайный виджет последних сообщений установлен вашим клиентом без вашего ведома.
  • Все

- @nacin

С is_main_query()учетом вышесказанного, если вы не исключите свой фильтр, используйте условное условие: тогда ваш фильтр сработает в вашем новом WP_Query.

Если вы хотите настроить таргетинг только на свой новый WP_Query, то сделать это невозможно.

Chris_O
источник
Как насчет техники Майло? Я никогда не видел это раньше ...
brasofilo
Его техника будет работать. Я никогда не использовал его для pre_get_posts, но использовал для других фильтров, таких как posts_where
Chris_O
1
Круто, что-то новое узнал сегодня!
brasofilo