Como limitar o número de postagens que WP_Query recebe?
-
-
Apenas 'posts_per_page=5'`Just `'posts_per_page=5'`
- 0
- 2015-03-18
- Pieter Goosen
-
Eu usoisso,mas queencontroutodos osposts.Seeu acessar apropriedade `Found_posts`,ele diz umnúmeromaior que 5. Eu quero queminha consulta segure apenas 5postagens.Épossível?@Pietergoosen.I 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
-
Vocênão deve definir oparâmetro `Nopaging`,definindo quepara o verdadeiromeiospara obter **tudo **postsYou should not set the `nopaging` parameter, setting that to true means to get **all** posts
- 0
- 2015-03-18
- Pieter Goosen
-
@Pietergoosen Seeunão definir oparâmetro `Nopaging`,obtém opadrão que é`false`,então ofrontpagemostra 5posts,mas a consulta émais.Eu adiciono umaimagem àpergunta.@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
-
Seus comentários são confusos,vocêpediupara limitar a quantidade depostagensmostradasem umapáginapara 5,éisso que você recebe.Agora,você diz (releia seu comentário anterior :-)) A consulta émais.Porfavorexplique.Vocênãopode definirposts_per_pagee,em seguida,usarno_paging definido comotruenamesma consulta,éposts_per_page ** ou **nopagem definida comotrueYour 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
-
Minhapergunta diz "recebe".Eu acho que se a consulta detémmaisposts que osmostrados,estáfazendomaistrabalho do que onecessário.Eu só quero saber se épossívelevitarisso.Eunão quero resultadosnavegáveis com umanavegaçãoescondida.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
-
A consultanãoterámaisposts que vocêpediu.Se vocêpedir 5,5posts serão recuperados se houvermais de 5postagens que correspondam aos requisitos.Faça um `var_dump ()` da sua consulta,como se sua variável de consulta é `$ query`,do` var_dump ($ query->posts) `.Você só verá as 5postagens que você consultouparaThe 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 respostas
- votos
-
- 2015-03-18
Eu acho que agoraeuentendo o que vocêestátentandofazer. Quando vocêexecuta uma consultapersonalizada com
wp_query
e defina o limitepara obter apenas 5postagensporpágina,apenas 5postagens serão recuperadaspela consultae essa consulta sómanterá 5posts,/forte> Por causa dapaginação,wp_query
ainda éexecutado através detodo obanco de dadose contatodos osposts que correspondem aos critérios da consulta.Issopode ser visto quando você olhapara o
$found_posts
e$max_num_pages
Propriedades da consulta. Vamos dar umexemplo:Vocêtem 20postagenspertencentes aotipo depostagempadrão
post
. Você apenas precisa dos últimos 5posts sempaginação. Sua consultapareceesta p>$ Q=NOVO WP_Query ('posts_per_page=5');
-
var_dump ($ Q- & GT;posts)
lhe dará os últimos 5posts comoesperado -
echo $ Q- >found_posts
lhe dará20
-
echo $ Q- >max_num_pages
lhe dará4
Oimpacto destetrabalhoextra émínimoem sites com apenas algunsposts,masissopode ser caro se vocêestiverexecutando um site com centenas oumilhares depostagens. Este é um desperdício de recursos,se vocêprecisar apenas de 5postagensmais recentes
Existe umparâmetroindocumentado chamado
no_found_rows
que usa valoresbooleanos que vocêpode usarparatornar suafiança de consulta depois queencontrou as 5postagens que vocêprecisa. IssoforçaráWP_Query paranãoprocurarmais quaisquermensagensmating os critérios depois queele recuperou a quantidade depostagens consultadas. Esteparâmetrojá é construídoem get_posts
,éporisso queget_posts
é umpoucomais rápido quewp_query
emboraget_posts
uses < Código> WP_QueryConclusão
Em conclusão,se vocênão vai usar apaginaçãoem uma consulta,é sempre sábio
'no_found_rows=true'
em sua consultapara acelerar as coisase paraeconomizarem desperdiçar recursos.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
Após a conversa com @Pieter Goosennos comentários dapergunta,acho queposso responder aperguntae explicarmeuerro.
A chave é que
found_posts
estavame confusando.Eu acho queessenúmero é osposts recuperados,masnão é. é onúmero depostagens que correspondem aos critérios .É como oWP_Query
tinha 2partes: umparaencontrar (todos) aspostagense outrasparabuscar o conteúdo,quandoele verificapara opaginação
parâmetros.Portanto,temos o$ Post_Count propriedade que é onúmero depostagensfetched (Codex diz Onúmero depostagensexibidas
),que,claro,éigual aonúmeronoPosts_per_Page
parâmetroe onúmero deitensno$posts
propriedade damatriz.Então
wp_query
nãoestáfazendonenhumtrabalhoinútil,comoeupensava ^^Espero queisso ajude os outros!
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!
-
Vejaminha resposta.Eu acho queentendo o que você quer dizer :-)See my answer. I think I understand what you mean :-)
- 0
- 2015-03-18
- Pieter Goosen
-
Sim!Vocêfezmuitobem: Finalmenteeutenho o caminhoparafazerisso,e euentendotudo=D obrigado @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
-
Feito!Estendiaminhaprópria resposta ^^ @pietergoosenDone! It extended my own answer ^^ @PieterGoosen
- 0
- 2015-03-19
- EliasNS
-
- 2015-03-18
OK,permiteter umtipo depostagem chamado 'blog_posts',e você querbuscar 5posts dessetipo depostagem.Aquiestá o que vocêprecisafazer
$ args=array ( 'post_type'=>'postagensnoblog', 'posts_per_page'=>'5', ); $ query=novo WP_Query ($ args);
A consulta acima retornará 5posts dotipo 'blog_posts',senãofor umtipo depostagempersonalizado,basta substituir comoeste
'post_type'=>'Postagens',
Se você quiserbuscartodas aspostagens,substitua comoeste'posts_per_page'=>'-1',
,paramais detalhes consulta WPOk , 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-
Veja os comentários sobre apergunta,porfavor.See the comments on the question, please.
- 0
- 2015-03-18
- EliasNS
-
- 2015-03-18
Eu sei que @ user1750063mencionou o código,mastente este
$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` éinválido como um valor de 'Orderby`e`paginação' é umparâmetroinválido`id` is invalid as an `orderby` value and `pagination` is an invalid parameter
- 0
- 2015-03-18
- Pieter Goosen
-
`paginaçãonão é umparâmetro válido.Você quer dizer "Nopagem"=> verdadeira "?Se sim,entãoeu voupegartodas aspostagens.Não éisso queeu quero.@Pietergoosen Acho queele significa "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
-
O PedeBy éparaexibir opedido,certo?Nãoprejudica o valor/parâmetronopaging. @Pietergoosen Por que a IDe a Oração éinválida?Vocêpodeesclarecer oponto?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
-
Deve ser "id",não "id`It should be `ID`, not `id`
- 0
- 2015-03-18
- Pieter Goosen
-
- 2020-06-18
Euiria limitá-lo com campospersonalizados,verifiqueesta amostra de consulta abaixo:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
Devolverá 6projetosem destaque.
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.
Eutenhopesquisadono Googlee WPSEe a única coisa que vejo repetidamente é usar
showposts
,que é reprovado.Euestoufamiliarizado com
wp_query
,e pensei que,seeu definirPosts_per_Page
nomeu limite (ou seja,5),enopagem
paraTrue
,seria algo como " OK,eu voute dar apenas 5postagens ".Masissonãofunciona.Comopossofazerisso?