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.

Ben Pearson
źródło

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 );
Milo
źródło
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.

Chris_O
źródło
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