web-dev-qa-db-fra.com

Comment limiter le nombre de publications que WP_Query reçoit?

J'ai fait des recherches sur Google et WPSE et la seule chose que je vois à plusieurs reprises est d'utiliser showposts, qui est obsolète.

Je connais bien WP_Query et je pensais que si je fixais posts_per_page à ma limite (c'est-à-dire 5) et nopaging à true, cela deviendrait quelque chose comme " Ok, je ne vous donnerai que 5 posts " . Mais ça ne marche pas.

enter image description here

Comment puis-je faire ceci?

23
EliasNS

Je pense que maintenant je comprends ce que vous essayez de faire. Lorsque vous exécutez une requête personnalisée avec WP_Query et définissez la limite pour obtenir 5 messages par page, seuls 5 messages seront extraits par la requête et cette requête ne contiendra que 5 messages,MAISpour des raisons de pagination. , WP_Query parcourt encore toute la base de données et compte toutes les publications qui correspondent aux critères de la requête.

Cela se voit lorsque vous examinez les propriétés $found_posts et $max_num_pages de la requête. Prenons un exemple:

Vous avez 20 publications appartenant au type de publication par défaut post. Vous seulement avez besoin des 5 derniers messages sans pagination. Votre requête ressemble à ceci

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) vous donnera les 5 derniers messages comme prévu
  • echo $q->found_posts vous donnera 20
  • echo $q->max_num_pages vous donnera 4

L'impact de ce travail supplémentaire est minime sur les sites avec seulement quelques publications, mais cela peut coûter cher si vous utilisez un site contenant des centaines, voire des milliers, de publications. C’est un gaspillage de ressources si vous n’avez besoin que des 5 derniers messages.

Il existe un paramètre non documenté appelé no_found_rows qui utilise des valeurs booléennes que vous pouvez utiliser pour rendre votre requête en attente après avoir trouvé les 5 publications dont vous avez besoin. Ceci forcera WP_Query à ne plus rechercher de publications répondant aux critères après avoir récupéré le nombre de publications demandées. Ce paramètre est déjà construit dans get_posts, c'est pourquoi get_posts est un peu plus rapide que WP_Query bien que get_posts utilise WP_Query

En conclusion, si vous n'utilisez pas la pagination pour une requête, il est toujours sage de 'no_found_rows=true' dans votre requête pour accélérer les choses et économiser sur le gaspillage de ressources.

38
Pieter Goosen

Je sais que @ user1750063 a mentionné le code mais essayez ceci

$args = array (
    'post_type'              => 'custom_post',
    'nopaging'               => false,
    'posts_per_page'         => '5',
    'order'                  => 'DESC',
    'orderby'                => 'ID',
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // display content
    }
} else {
    // display when no posts found
}

wp_reset_postdata();     // Restore original Post Data
2
Shreyo Gi

Après la conversation avec @Pieter Goosen sur les commentaires de la question, je pense pouvoir répondre à la question et expliquer mon erreur.

La clé est que found_posts m'a confondu. Je pense que ce nombre correspond aux messages récupérés, mais ne l’est pas. C'est le nombre de messages qui correspondent aux critères . C'est comme si le WP_Query avait 2 parties: une pour trouver (tous) les posts, et une autre pour aller chercher le contenu, quand il vérifie les paramètres pagination. Nous avons donc la propriété $post_count qui correspond au nombre de publications récupérées (le Codex indique The number of posts being displayed), ce qui est bien sûr égal au nombre du paramètre posts_per_page et au nombre d'éléments de la propriété de tableau $posts.

Donc, WP_Query ne fait pas de travail inutile, comme je le pensais ^^

J'espère que cela aide les autres!

2
EliasNS

Ok, permet d'avoir un type de message appelé 'blog_posts', et vous voulez récupérer 5 messages de ce type de message. Voici ce que tu dois faire

$args = array(
        'post_type' => 'blog_posts',
        'posts_per_page' => '5',
);


$query = new WP_Query($args);

La requête ci-dessus renvoie 5 messages de type 'blog_posts'. S'il ne s'agit pas d'un type de message personnalisé, remplacez-le simplement par ce 'post_type' => 'posts', si vous souhaitez récupérer tous les messages, puis remplacez-le comme ceci par 'posts_per_page' => '-1',, pour plus de détails WP Requête

1
shuvroMithun