¿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_postste dará20echo $q->max_num_pageste 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
Pieter Goosen
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.
Elías Gómez
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?
Shreyo Gi
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!
Elías Gómez