Використання 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();

EDIT

Ще одна методика, яку ви можете використовувати, - це встановити власний 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 );

Дякую тобі Міло. Це дійсно дуже корисно. Мені завжди було цікаво, чи можна встановити власний вар. Запитів.
Бен Пірсон

Як я можу використовувати цей трюк для сторінки архіву? Я не хочу повторно переписувати весь запит на сторінку архіву, але хочу використовувати цю техніку.
Рохіт Панде

4

pre_get_posts запускається для кожного запиту:

  • get_posts ()
  • новий WP_Query ()
  • Цей випадковий останній пост віджет, встановлений вашим клієнтом, не знаючи вас.
  • Все

- @nacin

Коли це сказано, якщо ви не виключаєте фільтр, використовуйте умовне: is_main_query() тоді ваш фільтр запуститься на ваш новий WP_Query.

Якщо ви хочете лише націлити свій конкретний новий WP_Query, тоді це не існує.


А що з технікою Міло? Я ніколи цього не бачив ...
brasofilo

Його техніка спрацює. Я ніколи не використовував його для pre_get_posts, але мав для інших фільтрів, таких як posts_where
Chris_O

1
Класно, щось нове дізналися сьогодні!
brasofilo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.