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 any query. Il est le plus souvent utilisé pour modifier uniquement la" requête principale "."
Il est possible d'utiliser pre_get_posts
pour filtrer only 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.
Le moyen le plus simple est d’ajouter l’action juste avant la requête et de 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();
EDIT
Une autre technique que vous pouvez utiliser consiste à définir votre propre requête var et à la vérifier dans un hook:
// 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 );
pre_get_posts
se déclenche pour chaque requête de publication:
- get_posts ()
- new WP_Query ()
- Ce widget de messages récents et aléatoires a été installé par votre client à votre insu.
- Tout
- @nacin
Cela étant dit, sauf si vous excluez votre filtre, utilisez la condition: is_main_query()
, votre filtre se déclenchera sur votre nouveau WP_Query.
Si vous souhaitez uniquement cibler votre nouveau WP_Query spécifique, vous ne pouvez le faire.