¿Cómo limitar el número de entradas que obtiene WP_Query?
He estado investigando en Google y WPSE y lo único que veo repetidamente es usar showposts
, que está obsoleto.
Estoy familiarizado con WP_Query
, y pensé que si establecía posts_per_page
a mi límite (por ejemplo, 5), y nopaging
a true
, se convertiría en algo como "Ok, te daré solo 5 entradas". Pero esto no funciona.
¿Cómo puedo hacer esto?

Creo que ahora entiendo lo que estás tratando de hacer. Cuando ejecutas una consulta personalizada con WP_Query
y estableces el límite para obtener solo 5 entradas por página, solo se recuperarán 5 entradas mediante la consulta y esa consulta solo contendrá 5 entradas, PERO para efectos de paginación, WP_Query
aún recorre toda la base de datos y cuenta todas las entradas que coinciden con los criterios de la consulta.
Esto se puede ver cuando miras las propiedades $found_posts
y $max_num_pages
de la consulta. Tomemos un ejemplo:
Tienes 20 entradas pertenecientes al tipo de entrada predeterminado post
. Solo necesitas las últimas 5 entradas sin paginación. Tu consulta se ve así:
$q = new WP_Query( 'posts_per_page=5' );
var_dump( $q->posts )
te dará las últimas 5 entradas como se esperabaecho $q->found_posts
te dará20
echo $q->max_num_pages
te dará4
El impacto de este trabajo adicional es mínimo en sitios con pocas entradas, pero puede volverse costoso si estás ejecutando un sitio con cientos o miles de entradas. Esto es un desperdicio de recursos si solo vas a necesitar las 5 últimas entradas.
Existe un parámetro no documentado llamado no_found_rows
que utiliza valores booleanos que puedes usar para hacer que tu consulta se detenga después de encontrar las 5 entradas que necesitas. Esto forzará a WP_Query
a no buscar más entradas que coincidan con los criterios después de haber recuperado la cantidad de entradas consultadas. Este parámetro ya está integrado en get_posts
, es por eso que get_posts
es un poco más rápido que WP_Query
aunque get_posts
utiliza WP_Query
Conclusión
En conclusión, si no vas a utilizar paginación en una consulta, siempre es aconsejable usar 'no_found_rows=true'
en tu consulta para acelerar las cosas y evitar el desperdicio de recursos.

Ok, supongamos que tienes un tipo de entrada llamado 'blog_posts' y quieres obtener 5 entradas de ese tipo. Esto es lo que necesitas hacer
$args = array(
'post_type' => 'blog_posts',
'posts_per_page' => '5',
);
$query = new WP_Query($args);
La consulta anterior devolverá 5 entradas del tipo 'blog_posts'. Si no es un tipo de entrada personalizado, entonces simplemente reemplaza así 'post_type' => 'posts',
si quieres obtener todas las entradas entonces reemplaza así 'posts_per_page' => '-1',
, para más detalles consulta WP Query

Sé que @user1750063 ha mencionado el código pero prueba esto
$args = array (
'post_type' => 'custom_post', // tipo de publicación personalizada
'nopaging' => false, // paginación activada
'posts_per_page' => '5', // 5 publicaciones por página
'order' => 'DESC', // orden descendente
'orderby' => 'ID', // ordenar por ID
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// mostrar contenido
}
} else {
// mostrar cuando no se encuentran publicaciones
}
wp_reset_postdata(); // Restaurar los datos originales de la publicación

id
no es válido como valor para orderby
y pagination
es un parámetro inválido

pagination
no es un parámetro válido. ¿Te refieres a 'nopaging' => true
? Si es así, entonces obtendré TODOS los posts. Eso no es lo que quiero. @PieterGoosen Creo que se refiere a ID
.

orderby es para mostrar el orden, ¿verdad? No afecta al valor/parámetro nopaging.
@PieterGoosen ¿por qué ID y orderby son inválidos? ¿Puedes aclarar este punto?

Después de la conversación con @Pieter Goosen en los comentarios de la pregunta, creo que puedo responder la pregunta y explicar mi error.
La clave es que found_posts
me estaba confundiendo. Pensé que ese número eran los posts recuperados pero no es así. Es el número de posts que coinciden con el criterio. Es como si WP_Query
tuviera 2 partes: una para encontrar (todos) los posts, y otra para obtener el contenido, cuando verifica los parámetros de pagination
. Así que tenemos la propiedad $post_count
que es el número de posts obtenidos (el Codex dice El número de posts que se están mostrando
), que por supuesto es igual al número en el parámetro posts_per_page
, y el número de elementos en la propiedad del array $posts
.
Así que WP_Query
no está haciendo ningún trabajo innecesario, como yo pensaba ^^
¡Espero que esto ayude a otros!

¡Sí! Lo hiciste muy bien :D Finalmente encontré la manera de hacerlo, ¡y lo entiendo todo! =D ¡Gracias @PieterGoosen!
