web-dev-qa-db-fra.com

"pre_get_posts" déclenche à chaque requête

Comment puis-je modifier les arguments de la requête principale uniquement et ne pas affecter d'autres requêtes?

add_filter('pre_get_posts', 'custom_post_count');
function custom_post_count($query){
  $query->set('posts_per_page', 5);
  return $query;
};

Etant donné que cette action est appelée dans la méthode get_posts de WP_Query, ce code modifiera l'argument posts_per_page de toutes les boucles, et pas uniquement de la boucle principale. Il est donc inutile de passer cet argument à WP_Query ...

3
onetrickpony

Fondamentalement, vous recherchez la variableglobal $wp_the_queryqui est définie sur la valeur de la requête principale. Cela peut ne pas convenir parfaitement à 100% des cas, mais fonctionnera probablement bien dans 99% des cas:

add_action( 'pre_get_posts', 'custom_post_count' );
function custom_post_count( $query ){
  global $wp_the_query;
  if ( $wp_the_query === $query ) {
    $query->set( 'posts_per_page', 5 );
  }
  return $query;
};
7
MikeSchinkel

Premièrement, 'pre_get_posts' est une action et non un filtre. C'est le principal problème à commencer. Deuxièmement, vous devez définir des conditions conditionnelles pour le contexte.

add_action('wp', 'custom_post_count');
function custom_post_count($query){
    if($query->is_home || $query->is_front_page){
        $query->set('posts_per_page', 5);
    }
    return $query;
};

L'exemple précédent est si vous voulez utiliser cela une fois dans votre functions.php sans toucher vos fichiers de modèle. En ce qui concerne chaque requête, si vous ne créez pas de nouvelle requête, chaque boucle héritant de la requête $ pre_get_posts. C'est pourquoi j'utilise query_posts () pour créer une nouvelle requête dans l'exemple suivant.

Boucles personnalisées

Voici comment je crée des boucles personnalisées:

$args = array(
    'posts_per_page' => 5
);
query_posts($args);

if(have_posts()): while(have_posts()): the_post();


endwhile; else:

endif;

wp_reset_query();

Placez simplement query_posts () au-dessus de la boucle et wp_reset_query () à la fin de la boucle.

J'espère que cela vous aide. :)

5
Brian Fegter