Comment limiter le nombre de publications reçues par WP_Query?

19

J'ai effectué 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 messages ". Mais cela ne fonctionne pas.

Comment puis-je faire cela?

    
posée EliasNS 18.03.2015 - 11:52

4 réponses

37

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 un nombre maximal de 5 publications par page, la requête récupérera uniquement 5 publications et cette requête ne contiendra que 5 publications, BUT . Par souci de pagination, WP_Query parcourt toujours la base de données entière et compte tous les articles correspondant 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. Cela 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à intégré à 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.

    
réponse donnée Pieter Goosen 18.03.2015 - 13:22
2

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 était en train de me confondre. Je pense que ce nombre correspond aux messages récupérés, mais ne l’est pas. Il s'agit du nombre de publications correspondant aux critères . C'est comme si WP_Query avait 2 parties: une pour trouver (tous) les posts et une autre pour récupérer le contenu, lorsqu'elle 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 ), qui est bien sûr égale au nombre figurant dans le paramètre posts_per_page et le nombre d'éléments de la propriété $posts .

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

J'espère que cela aide les autres!

    
réponse donnée EliasNS 18.03.2015 - 13:16
2

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
    
réponse donnée Shreyo Gi 18.03.2015 - 12:50
0

Ok, vous avez un type de message appelé 'blog_posts' et vous souhaitez récupérer 5 messages de ce type de message. Voici ce que vous devez faire

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


$query = new WP_Query($args);

La requête ci-dessus renvoie 5 articles de type 'blog_posts'. S'il ne s'agit pas d'un type d'article personnalisé, remplacez simplement comme ceci 'post_type' => 'posts', si vous souhaitez récupérer tous les articles, puis remplacez-les ainsi: 'posts_per_page' => '-1', , etc. détails Requête WP

    
réponse donnée shuvroMithun 18.03.2015 - 12:07

Lire d'autres questions sur les étiquettes