Używanie pre_get_posts z WP_Query


24

Czytałam Stephen Harris doskonałą odpowiedź „s do tej kwestii dotyczących stosowania WP_query(), query_posts()i pre_get_posts.

Mówi: „pre_get_posts to filtr służący do zmiany dowolnego zapytania. Najczęściej jest używany do zmiany tylko„ głównego zapytania ”.

Można użyć pre_get_postsdo filtrowania tylko określonego dodatkowego zapytania utworzonego za pomocą WP_Query? na przykład.

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

Każda pomoc bardzo doceniana.

Odpowiedzi:


23

Najprostszym sposobem jest dodanie akcji tuż przed zapytaniem i usunięcie jej natychmiast po niej.

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

EDYTOWAĆ

Inną techniką, której możesz użyć, jest ustawienie własnego zapytania var i sprawdzenie tego w zaczepie:

// 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' );

oraz w szablonie:

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

Dziękuję bardzo Milo. To jest naprawdę bardzo pomocne. Zawsze zastanawiałem się, czy można ustawić własne zapytanie var.
— Ben Pearson,

Jak mogę użyć tej sztuczki do zarchiwizowania strony? Nie chcę ponownie przepisywać całego zapytania dla strony archiwum, ale chcę użyć tej techniki.
— Rohit Pande

4

pre_get_posts odpala dla każdego zapytania pocztowego:

  • get_posts ()
  • nowa WP_Query ()
  • Ten losowy ostatni post widżet zainstalowany przez klienta bez Twojej wiedzy.
  • Wszystko

- @nacin

Mając to na uwadze, chyba że wykluczysz swój filtr, użyj warunkowego: is_main_query()wtedy twój filtr uruchomi się na twoim nowym WP_Query.

Jeśli chcesz kierować tylko swoje nowe WP_Query, nie ma na to sposobu.


Co z techniką Milo? Nigdy wcześniej tego nie widziałem ...
— brasofilo

Jego technika zadziała. Nigdy nie używałem go do pre_get_posts, ale mam do innych filtrów, takich jak posts_where
— Chris_O

1
Fajnie, dziś nauczyłem się czegoś nowego!
— brasofilo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.