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.

Ben Pearson
la source

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 );
Milo
la source
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.

Chris_O
la source
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