Comment limiter le nombre de publications que WP_Query obtient?
-
-
Juste ``posts_per_page=5 ''Just `'posts_per_page=5'`
- 0
- 2015-03-18
- Pieter Goosen
-
J'utilise ça,mais çatrouvetous lesmessages.Sij'accède à lapropriété `found_posts`,elleindique unnombre supérieur à 5. Je veux quema requêtene contienne que 5messages.C'estpossible?@PieterGoosenI use that, but that found all the posts. If I access to the `found_posts` property, it says a higher number than 5. I want my query to hold only 5 posts. ¿Is it possible? @PieterGoosen
- 0
- 2015-03-18
- EliasNS
-
Vousne devezpas définir leparamètre `nopaging`,le définir surtrue signifie obtenir **tous ** lespublicationsYou should not set the `nopaging` parameter, setting that to true means to get **all** posts
- 0
- 2015-03-18
- Pieter Goosen
-
@PieterGoosen Sije ne règlepas leparamètre `nopaging`,la valeurpar défautest`false`,donc lapage d'accueil affiche 5 articles,mais la requêteen contientplus.J'ajoute uneimage à la question.@PieterGoosen If I don't set the `nopaging` parameter it gets the default that is `false`, so the frontpage shows 5 posts, but the query holds more. I add an image to the question.
- 0
- 2015-03-18
- EliasNS
-
Vos commentaires sont déroutants,vous avez demandé de limiter lenombre demessages affichés sur unepage à 5,c'est ce que vous obtenez.Maintenant,vous dites (relisez votre commentaireprécédent :-)) la requête contientplus.S'il vousplaît,expliquez.Vousne pouvezpas définirposts_per_page,puis utiliserno_paging défini surtrue dans lamême requête,il s'agit soit deposts_per_page ** OU **nopaging défini surtrueYour comments are confusing, you asked to limit the amount of posts shown on a page to 5, that is what you get. Now, you say (reread your previous comment :-)) the query holds more. Please explain. You cannot set posts_per_page and then use no_paging set to true in the same query, it is either posts_per_page **OR** nopaging set to true
- 0
- 2015-03-18
- Pieter Goosen
-
Ma question dit «obtient».Jepense que si la requête contientplus demessages que ceux affichés,ellefaitplus detravail quenécessaire.Je veuxjuste savoir s'ilestpossible d'éviter cela.Jene veuxpas de résultatsnavigables avec unenavigationmasquée.My question says "gets". I think that if the query holds more posts that the shown ones, it is doing more work than needed. I just want to know if it is possible to avoid that. I don't want navigable results with a hidden navigation.
- 0
- 2015-03-18
- EliasNS
-
La requêtene contiendraplus lespublications que vous avez demandées.Si vous demandez 5,5messages seront récupérés s'il y aplus de 5messages qui correspondent auxexigences.Faites un `var_dump ()` de votre requête,comme si votre variable de requêteest `$ query`,faites` var_dump ($ query->posts) `.Vousne verrez que les 5messagespour lesquels vous avez demandéThe query will not hold more posts that you have asked for. If you ask for 5, 5 posts will be retrieved if there is more than 5 posts that matches the requirements. Do a `var_dump()` of your query, like if your query variable is `$query`, do `var_dump( $query->posts )`. You will only see the 5 posts you queried for
- 0
- 2015-03-18
- Pieter Goosen
-
5 réponses
- votes
-
- 2015-03-18
Jepense quemaintenantje comprends ce que vousessayez defaire. Lorsque vousexécutez une requêtepersonnalisée avec
WP_Query
et que vous définissez la limitepour obtenir seulement 5 articlesparpage,seuls 5 articles seront récupéréspar la requêteet cette requêtene contiendra que 5 articles, MAIS pour des raisons depagination,WP_Query
continue deparcourirtoute labase de donnéeset comptetoutes lespublications correspondant aux critères de la requête.Celapeut être vu lorsque vous regardez lespropriétés
$found_posts
et$max_num_pages
de la requête. Prenons unexemple:Vous avez 20 articles appartenant autype depublicationpar défaut
post
. Vous avez seulement besoin des 5 derniersmessages sanspagination. Votre requête ressemble à ceci$ q=new WP_Query ('posts_per_page=5');
-
var_dump ($ q- >posts)
vous donnera les 5 derniersmessages commeprévu -
echo $ q- >found_posts
vous donnera20
-
echo $ q- >max_num_pages
vous donnera4
L'impact de cetravail supplémentaireestminime sur les sites avec seulement quelquesmessages,mais celapeut devenir coûteux si vousexécutez un site avec des centaines ou desmilliers demessages. C'est ungaspillage de ressources si vousn'avezbesoin que des 5 derniersmessages
Ilexiste unparamètrenon documenté appelé
no_found_rows
qui utilise des valeursbooléennes que vouspouvez utiliserpour rendre votre requêteen liberté après avoirtrouvé les 5messages dont vous avezbesoin. CelaforceraWP_Query
àne plus rechercher demessages correspondant aux critères après avoir récupéré lenombre demessagesinterrogés. Ceparamètreest déjàintégré àget_posts
,c'estpourquoiget_posts
est unpeuplus rapide queWP_Query
bien queget_posts
utilise < code> WP_QueryConclusion
En conclusion,si vousn'utilisezpas depagination sur une requête,ilesttoujours sage de
'no_found_rows=true'
dans votre requêtepour accélérer les choseset pour économiser sur legaspillage de ressources.I think that now I understand what you are trying to do. When you run a custom query with
WP_Query
and set the limit to get only 5 posts per page, only 5 posts will be retrieved by the query and that query will only hold 5 posts, BUT for the sake of pagination,WP_Query
still runs through the whole database and counts all the posts that matches the criteria of the query.That can be seen when you look at the
$found_posts
and$max_num_pages
properties of the query. Lets take an example:You have 20 posts belonging to the default post type
post
. You only need the latest 5 posts without pagination. Your query looks like this$q = new WP_Query( 'posts_per_page=5' );
var_dump( $q->posts )
will give you the latest 5 posts as expectedecho $q->found_posts
will give you20
echo $q->max_num_pages
will give you4
The impact of this extra work is minimal on sites with only a few posts, but this can gt expensive if you are running a site with hundreds or thousands of posts. This is a waste of resources if you are only ever going to need the 5 latest posts
There is an undocumented parameter called
no_found_rows
which uses boolean values which you can use to make your query bail after it found the 5 posts you need. This will forceWP_Query
not to look for any more posts mathing the criteria after it has retrieved the amount of posts queried. This parameter is already build intoget_posts
, that is whyget_posts
is a bit faster thanWP_Query
althoughget_posts
usesWP_Query
Conclusion
In conclusion, if you are not going to use pagination on a query, it is always wise to
'no_found_rows=true'
in your query to speed things up and to save on wasting resources. -
- 2015-03-18
Après la conversation avec @Pieter Goosen sur les commentaires de la question,je pense queje peux répondre à la questionet expliquermonerreur.
La cléest que
found_posts
me déroutait.Jepense que cenombre correspond auxmessages récupérés,maisne l'estpas. C'est lenombre demessages qui correspondent aux critères .C'est comme si leWP_Query
avait 2parties: unepourtrouver (tous) les articles,et l'autrepour récupérer le contenu,quandil vérifie lesparamètres depagination
.On a donc lapropriété$post_count
quiest lenombre deposts récupérés (le Codex ditLenombre deposts affichés
),celabien sûrest égal aunombre surposts_per_page et lenombre d'éléments de lapropriété dutableau $posts
.Donc,
WP_Query
ne fait aucuntravailinutile,commeje lepensais ^^J'espère que cela aidera les autres!
After the conversation with @Pieter Goosen on the comments of the question, I think I can answer the question and explain my mistake.
The key is that
found_posts
was confussing me. I thougth that, that number is the posts retrieved but is not. It is the number of posts that match the criteria. It's like theWP_Query
had 2 parts: one for finding (all) the posts, and other for fetching the content, when it checks for thepagination
parameters. So we have the$post_count
property that is the number of posts fetched (Codex saysThe number of posts being displayed
), that of course is equal to the number onposts_per_page
parameter, and the number of items on the$posts
array property.So
WP_Query
is not doing any useless work, as I thought ^^Hope this helps others!
-
Voyezma réponse.Jepense queje comprends ce quetu veux dire :-)See my answer. I think I understand what you mean :-)
- 0
- 2015-03-18
- Pieter Goosen
-
Oui!Vous l'aveztrèsbien fait: D Enfin,j'aitrouvé lemoyen de lefaire,et je comprendstout=D Merci @PieterGoosen!Yes! You did it very well :D Finally I got the way to do it, and I understand all =D Thanks @PieterGoosen!
- 0
- 2015-03-19
- EliasNS
-
Terminé!Il a étendumapropre réponse ^^ @PieterGoosenDone! It extended my own answer ^^ @PieterGoosen
- 0
- 2015-03-19
- EliasNS
-
- 2015-03-18
Ok,vouspermet d'avoir untype demessage appelé "blog_posts",et vous voulez récupérer 5messages de cetype demessage.Voici ce que vous devezfaire
$args = array( 'post_type' => 'blog_posts', 'posts_per_page' => '5', ); $query = new WP_Query($args);
La requête ci-dessus renverra 5 articles detype 'blog_posts',s'ilne s'agitpas d'untype d'articlepersonnalisé,remplacez simplement comme ceci
'post_type' => 'posts',
si vous souhaitez récupérertous lesmessages,remplacez-les comme suit'posts_per_page' => '-1',
,pourplus de détails, WP QueryOk , lets you have post type called 'blog_posts' , and you want to fetch 5 posts of that post type . Here is what you need to do
$args = array( 'post_type' => 'blog_posts', 'posts_per_page' => '5', ); $query = new WP_Query($args);
The above query will return 5 posts of type 'blog_posts' , if it is not a custom post type , then just replace like this
'post_type' => 'posts',
if you want to fetch all posts then replace like this'posts_per_page' => '-1',
, for more details WP Query-
Voir les commentaires sur la question,s'il vousplaît.See the comments on the question, please.
- 0
- 2015-03-18
- EliasNS
-
- 2015-03-18
Je sais que @ user1750063 amentionné le codemaisessayez 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
I know that @user1750063 has mentioned the code but try this
$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
-
`id`estinvalideen tant que valeur` orderby`et `pagination`est unparamètreinvalide`id` is invalid as an `orderby` value and `pagination` is an invalid parameter
- 0
- 2015-03-18
- Pieter Goosen
-
`pagination`n'estpas unparamètre valide.Vous voulez dire ``nopaging '=>true`?Si oui,je recevrai TOUS lesmessages.Cen'estpas ce queje veux.@PieterGoosen Jepense qu'il veut dire «ID».`pagination`is not a valid parameter. You mean `'nopaging' => true`? If yes, then I'll get ALL posts. That's not what I want. @PieterGoosen I think he means `ID`.
- 0
- 2015-03-18
- EliasNS
-
orderby sert à afficher la commande,non?Celan'endommagepas la valeur/leparamètrenopaging. @PieterGoosen Pourquoi ID & orderbyest-ilinvalide?Pouvez-vous clarifier cepoint?orderby is for displaying the order, right? It does not harm the nopaging value/ parameter. @PieterGoosen why is ID & orderby is invalid? Can you clarify the point?
- 0
- 2015-03-18
- Shreyo Gi
-
Ce devrait être «ID»,pas «id»It should be `ID`, not `id`
- 0
- 2015-03-18
- Pieter Goosen
-
- 2020-06-18
Je le limiterais avec des champspersonnalisés,consultez cetexemple de requête ci-dessous:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
Il renverra 6projetsen vedette.
I would limit it with custom fields, check this query sample below:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
It will return 6 Featured projects.
J'aifait des recherches sur Googleet WPSEet la seule chose queje vois àplusieurs reprisesest d'utiliser
showposts
,quiest obsolète.Je connais
WP_Query
et jepensais que sije définissaisposts_per_page
àma limite (c'est-à-dire 5)etnopaging
àtrue
,cela deviendrait quelque chose comme " Ok,je ne vous donnerai que 5messages ".Mais celane fonctionnepas.Commentpuis-jefaire cela?