¿Cómo limitar la cantidad de publicaciones que recibe WP_Query?
-
-
Solo `'posts_per_page=5'`Just `'posts_per_page=5'`
- 0
- 2015-03-18
- Pieter Goosen
-
Yo usoeso,peroencontrétodas laspublicaciones.Si accedo a lapropiedad `found_posts`,dice unnúmeromayor que 5. Quiero quemi consulta contenga solo 5publicaciones.¿Esposible?@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
-
No debeestablecerelparámetro `nopaging`,establecerloen verdadero significa obtener **todas ** laspublicacionesYou should not set the `nopaging` parameter, setting that to true means to get **all** posts
- 0
- 2015-03-18
- Pieter Goosen
-
@PieterGoosen Sino configuroelparámetro `nopaging`,obtieneel valorpredeterminado quees`falso`,por lo que lapáginaprincipalmuestra 5publicaciones,pero la consulta contienemás.Añado unaimagen a lapregunta.@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
-
Sus comentarios son confusos,pidió limitar la cantidad depublicaciones que semuestranen unapágina a 5,esoes lo que obtiene.Ahora,dices (vuelve a leertu comentario anterior :-)) que la consulta contienemás.Porfavorexplique.Nopuedeestablecerposts_per_page y luego usarno_pagingestablecidoen trueen lamisma consulta,esposts_per_page ** O **nopagingestablecidoen trueYour 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
-
Mipregunta dice "consigue".Creo que si la consulta contienemáspublicaciones que lasmostradas,está haciendomástrabajo delnecesario.Solo quiero saber siesposibleevitarlo.No quiero resultadosnavegables con unanavegación oculta.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 consultano contendrámáspublicaciones de las que ha solicitado.Si solicita 5,se recuperarán 5publicaciones si haymás de 5publicaciones que cumplen con los requisitos.Haz un `var_dump ()` detu consulta,como situ variable de consultafuera `$ query`,haz` var_dump ($ query->posts) `.Solo verás las 5publicaciones que consultasteThe 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 respuestas
- votos
-
- 2015-03-18
Creo que ahora comprendo lo queestátratando de hacer. Cuandoejecuta una consultapersonalizada con
WP_Query
yestableceel límitepara obtener solo 5publicacionesporpágina,la consulta solo recuperará 5publicaciones yesa consulta solo contendrá 5publicaciones, PERO porelbien de lapaginación,WP_Query
todavía seejecutaen toda labase de datos y cuentatodas laspublicaciones que coinciden con los criterios de la consulta.Eso sepuede ver cuando observa laspropiedades
$found_posts
y$max_num_pages
de la consulta. Tomemos unejemplo:Tienes 20publicaciones quepertenecen altipo depublicaciónpredeterminado
post
. Solo necesitas las últimas 5publicaciones sinpaginación. Su consultatiene este aspecto$ q=new WP_Query ('posts_per_page=5');
-
var_dump ($ q- >posts)
le dará las últimas 5publicaciones como seesperaba -
echo $ q- >found_posts
le dará20
-
echo $ q- >max_num_pages
le dará4
Elimpacto deestetrabajo adicionalesmínimoen sitios con solo unaspocaspublicaciones,peroestopuede resultar costoso siestáejecutando un sitio con cientos omiles depublicaciones. Estoes un desperdicio de recursos si solo vas anecesitar las últimas 5publicaciones
Hay unparámetroindocumentado llamado
no_found_rows
que usa valoresbooleanos quepuedes usarpara hacer quetu consulta se salga después deencontrar las 5publicaciones quenecesitas. Esto obligará aWP_Query
anobuscarmáspublicaciones que cumplan los criterios después de haber recuperado la cantidad depublicaciones consultadas. Esteparámetro yaestáintegradoenget_posts
,poresoget_posts
es unpocomás rápido queWP_Query
aunqueget_posts
usa < código> WP_QueryConclusión
En conclusión,sino va a utilizar lapaginaciónen una consulta,siemprees aconsejable
'no_found_rows=true'
en su consultapara acelerar las cosas ypara ahorraren el desperdicio de 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
Después de la conversación con @Pieter Goosen sobre los comentarios de lapregunta,creo quepuedo responder lapregunta yexplicarmi error.
La clavees que
found_posts
me estaba confundiendo.Creo queesenúmero son losmensajes recuperados,perono loes. Es la cantidad depublicaciones que coinciden con los criterios .Es como sielWP_Query
tuviera 2partes: unaparabuscar (todas) laspublicaciones y otraparabuscarel contenido,cuandobusca losparámetros depagination
.Entoncestenemos lapropiedad$post_count
quees la cantidad depublicaciones obtenidas (el Codex diceThe number of posts being displayed
),quepor supuestoesigual alnúmeroenposts_per_page
yelnúmero deelementosen lapropiedad dematriz$posts
.Entonces
WP_Query
noestá haciendoningúntrabajoinútil,comopensé ^^¡Espero queesto ayude a otros!
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!
-
Mirami respuesta.Creo queentiendo lo que quieres decir :-)See my answer. I think I understand what you mean :-)
- 0
- 2015-03-18
- Pieter Goosen
-
¡Si!Lo hicistemuybien: D Finalmenteencontré lamanera de hacerlo,y loentiendotodo=D ¡Gracias @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
-
¡Hecho!Extendími propia respuesta ^^ @PieterGoosenDone! It extended my own answer ^^ @PieterGoosen
- 0
- 2015-03-19
- EliasNS
-
- 2015-03-18
Ok,te permitetener untipo depublicación llamado 'blog_posts' y quieres obtener 5publicaciones deesetipo.Estoes lo que debe hacer
$args = array( 'post_type' => 'blog_posts', 'posts_per_page' => '5', ); $query = new WP_Query($args);
La consulta anterior devolverá 5publicaciones detipo 'blog_posts',sinoes untipo depublicaciónpersonalizada,simplemente reemplace así
'post_type' => 'posts',
si desea obtenertodas laspublicaciones,reemplácelas así'posts_per_page' => '-1',
,para obtenermás detalles 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-
Vea los comentarios sobre lapregunta,porfavor.See the comments on the question, please.
- 0
- 2015-03-18
- EliasNS
-
- 2015-03-18
Sé que @ user1750063 hamencionadoel código,peropruebaesto
$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`noes válido como valor de` orderby` y `pagination`es unparámetrono válido`id` is invalid as an `orderby` value and `pagination` is an invalid parameter
- 0
- 2015-03-18
- Pieter Goosen
-
`pagination`noes unparámetro válido.¿Te refieres a ''nopaging '=>true`?Sies así,obtendré TODAS laspublicaciones.Esonoes lo que quiero.@PieterGoosen Creo que quiere decir "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
-
orderbyesparamostrarelpedido,¿verdad?No dañael valor/parámetro denopaginación. @PieterGoosen ¿por qué ID & orderbynoes válido?¿Puede aclararelpunto?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
-
Debe ser "ID",no "id"It should be `ID`, not `id`
- 0
- 2015-03-18
- Pieter Goosen
-
- 2020-06-18
Lo limitaría con campospersonalizados,consulteesteejemplo de consulta a continuación:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
Devolverá 6proyectos destacados.
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.
Heestadoinvestigandoen Google y WPSE y lo único que veo repetidamentees usar
showposts
,esoestá obsoleto.Estoyfamiliarizado con
WP_Query
ypensé que siestablecíaposts_per_page
en mi límite (es decir,5) ynopaging
entrue
,se convertiríaen algo como " Ok,te daré solo 5publicaciones ".Peroestonofunciona.¿Cómopuedo haceresto?