Utilisation de pre_get_posts avec WP_Query


24

Je lisais l 'excellente réponse de Stephen Harris à cette question concernant l' utilisation de WP_query(), query_posts()et pre_get_posts.

Il dit "pre_get_posts est un filtre, pour modifier n'importe quelle requête. Il est le plus souvent utilisé pour ne modifier que la" requête principale "."

Il est possible d'utiliser pre_get_postspour filtrer uniquement une requête secondaire spécifique créée avec WP_Query? par exemple.

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

Toute aide très appréciée.

Réponses:


23

Le moyen le plus simple consiste à ajouter l'action juste avant la requête et à la supprimer immédiatement après.

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

MODIFIER

Une autre technique que vous pouvez utiliser consiste à définir votre propre variable de requête et à vérifier cela dans un crochet:

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

et dans le modèle:

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

Merci beaucoup Milo. C'est vraiment très utile. Je me suis toujours demandé s'il était possible de définir votre propre var de requête.
Ben Pearson

Comment puis-je utiliser cette astuce pour la page d'archive? Je ne veux pas réécrire toute la requête pour la page d'archive, mais je veux utiliser cette technique.
Rohit Pande

4

pre_get_posts se déclenche pour chaque requête de post:

  • get_posts ()
  • new WP_Query ()
  • Ce widget de publications récentes aléatoires installé par votre client à votre insu.
  • Tout

- @nacin

Cela étant dit, sauf si vous excluez votre filtre, utilisez le conditionnel: is_main_query() votre filtre se déclenchera sur votre nouveau WP_Query.

Si vous souhaitez uniquement cibler votre nouveau WP_Query spécifique, il n'y a aucun moyen de le faire.


Et la technique de Milo? Je ne l'ai jamais vu auparavant ...
brasofilo

Sa technique fonctionnera. Je ne l'ai jamais utilisé pour pre_get_posts mais pour d'autres filtres comme posts_where
Chris_O

1
Cool, quelque chose de nouveau appris aujourd'hui!
brasofilo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.