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

25

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

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

entrez la description de l'image ici

Comment puis-je faire ceci?

EliasNS
la source
Just'posts_per_page=5'
Pieter Goosen
J'utilise cela, mais qui a trouvé tous les messages. Si j'accède à la found_postspropriété, il indique un nombre supérieur à 5. Je veux que ma requête ne contienne que 5 messages. C'est possible? @PieterGoosen
EliasNS
Vous ne devez pas définir le nopagingparamètre, le définir sur true signifie obtenir tous les messages
Pieter Goosen
@PieterGoosen Si je ne définis pas le nopagingparamètre, il obtient la valeur par défaut qui est false, donc la page d'accueil affiche 5 messages, mais la requête en contient plus. J'ajoute une image à la question.
EliasNS
Vos commentaires sont déroutants, vous avez demandé de limiter le nombre de messages affichés sur une page à 5, c'est ce que vous obtenez. Maintenant, vous dites (relisez votre commentaire précédent :-)) la requête tient plus. S'il vous plaît, expliquez. Vous ne pouvez pas définir posts_per_page, puis utiliser no_paging défini sur true dans la même requête, il s'agit soit de posts_per_page OU de nopaging défini sur true
Pieter Goosen

Réponses:

43

Je pense que maintenant je comprends ce que vous essayez de faire. Lorsque vous exécutez une requête personnalisée avec WP_Queryet définissez la limite pour obtenir seulement 5 publications par page, seules 5 publications seront récupérées par la requête et cette requête ne contiendra que 5 publications, MAIS pour des raisons de pagination, WP_Querycontinue de parcourir toute la base de données et compte tous les messages qui correspondent aux critères de la requête.

Cela peut être vu lorsque vous regardez les propriétés $found_postset $max_num_pagesde la requête. Prenons un exemple:

Vous avez 20 publications appartenant au type de publication par défaut post. Vous n'avez besoin que 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 te donnera 20
  • echo $q->max_num_pages te 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 gérez un site avec des centaines ou des milliers de publications. C'est un gaspillage de ressources si vous n'avez besoin que des 5 derniers articles

Il existe un paramètre non documenté appelé no_found_rowsqui utilise des valeurs booléennes que vous pouvez utiliser pour rendre votre requête sous caution après avoir trouvé les 5 publications dont vous avez besoin. Cela obligera à WP_Queryne plus rechercher de messages correspondant aux critères après avoir récupéré le nombre de messages interrogés. Ce paramètre est déjà intégré dans get_posts, c'est pourquoi get_postsest un peu plus rapide que WP_Querybien que les get_postsutilisationsWP_Query

Conclusion

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

Pieter Goosen
la source
3

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_postscela me déroutait. Je pense que ce nombre correspond aux messages récupérés, mais ce n'est pas le cas. C'est le nombre de postes qui correspondent aux critères . C'est comme WP_Querys'il y avait 2 parties: l'une pour trouver (tous) les messages, et l'autre pour récupérer le contenu, lorsqu'il vérifie les paginationparamètres. Nous avons donc la $post_countpropriété qui est le nombre de messages récupérés (Codex dit The number of posts being displayed), qui est bien sûr égal au nombre sur le posts_per_pageparamètre, et le nombre d'éléments sur la $postspropriété du tableau.

Donc , WP_Queryne fait rien de travail inutile, comme je pensais ^^

J'espère que cela aide les autres!

EliasNS
la source
Voir ma réponse. Je pense que je comprends ce que vous voulez dire :-)
Pieter Goosen
Oui! Vous l'avez très bien fait: D Enfin, j'ai eu le moyen de le faire, et je comprends tout = D Merci @PieterGoosen!
EliasNS
Terminé! Il a étendu ma propre réponse ^^ @PieterGoosen
EliasNS
1

Ok, vous permet d'avoir un type de publication appelé 'blog_posts', et vous souhaitez récupérer 5 publications de ce type de publication. 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 renverra 5 messages de type 'blog_posts', s'il ne s'agit pas d'un type de message personnalisé, remplacez simplement comme ceci 'post_type' => 'posts',si vous voulez récupérer tous les messages puis remplacez comme ceci 'posts_per_page' => '-1',, pour plus de détails WP Query

shuvroMithun
la source
Voir les commentaires sur la question, s'il vous plaît.
EliasNS
1

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
Shreyo Gi
la source
idn'est pas une orderbyvaleur et paginationest un paramètre non valide
Pieter Goosen
paginationn'est pas un paramètre valide. Tu veux dire 'nopaging' => true? Si oui, je recevrai TOUS les messages. Ce n'est pas ce que je veux. @PieterGoosen Je pense qu'il veut dire ID.
EliasNS
orderby est pour afficher la commande, non? Il n'endommage pas la valeur / le paramètre nopaging. @PieterGoosen pourquoi l'ID et la commande sont invalides? Pouvez-vous clarifier ce point?
Shreyo Gi
Ça devrait être ID, pasid
Pieter Goosen