¿Cómo limitar el número de entradas que obtiene WP_Query?

18 mar 2015, 12:52:15
Vistas: 247K
Votos: 48

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.

Ejemplo de código WP_Query en WordPress

¿Cómo puedo hacer esto?

7
Comentarios

Solo 'posts_per_page=5'

Pieter Goosen Pieter Goosen
18 mar 2015 12:56:47

Uso eso, pero encuentra todos los posts. Si accedo a la propiedad found_posts, muestra un número mayor que 5. Quiero que mi consulta contenga solo 5 posts. ¿Es posible? @PieterGoosen

Elías Gómez Elías Gómez
18 mar 2015 13:03:05

No deberías establecer el parámetro nopaging, establecerlo como true significa obtener todos los posts

Pieter Goosen Pieter Goosen
18 mar 2015 13:05:14

@PieterGoosen Si no establezco el parámetro nopaging obtiene el valor predeterminado que es false, por lo que la página principal muestra 5 entradas, pero la consulta contiene más. Agrego una imagen a la pregunta.

Elías Gómez Elías Gómez
18 mar 2015 13:09:37

Tus comentarios son confusos, pediste limitar la cantidad de entradas mostradas en una página a 5, que es lo que obtienes. Ahora dices (relee tu comentario anterior :-)) que la consulta contiene más. Por favor explica. No puedes establecer posts_per_page y luego usar no_paging configurado como true en la misma consulta, es o posts_per_page O nopaging configurado como true

Pieter Goosen Pieter Goosen
18 mar 2015 13:14:11

Mi pregunta dice "obtiene". Creo que si la consulta contiene más entradas que las mostradas, está haciendo más trabajo del necesario. Solo quiero saber si es posible evitar eso. No quiero resultados navegables con una navegación oculta.

Elías Gómez Elías Gómez
18 mar 2015 13:19:43

La consulta no contendrá más publicaciones de las que hayas solicitado. Si pides 5, se recuperarán 5 publicaciones si hay más de 5 publicaciones que cumplan con los requisitos. Realiza un var_dump() de tu consulta, como si tu variable de consulta es $query, haz var_dump( $query->posts ). Solo verás las 5 publicaciones que consultaste

Pieter Goosen Pieter Goosen
18 mar 2015 13:26:28
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 4
0
79

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 esperaba
  • echo $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.

18 mar 2015 14:22:12
1

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

18 mar 2015 13:07:02
Comentarios

Ver los comentarios en la pregunta, por favor.

Elías Gómez Elías Gómez
18 mar 2015 13:14:16
4

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
18 mar 2015 13:50:22
Comentarios

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

Pieter Goosen Pieter Goosen
18 mar 2015 13:58:09

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 Elías Gómez
18 mar 2015 14:00:29

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 Shreyo Gi
18 mar 2015 14:22:21

Debería ser ID, no id

Pieter Goosen Pieter Goosen
18 mar 2015 14:25:11
3

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!

18 mar 2015 14:16:53
Comentarios

Mira mi respuesta. Creo que entiendo lo que quieres decir :-)

Pieter Goosen Pieter Goosen
18 mar 2015 14:23:23

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

Elías Gómez Elías Gómez
19 mar 2015 02:17:48

¡Listo! Amplié mi propia respuesta ^^ @PieterGoosen

Elías Gómez Elías Gómez
19 mar 2015 16:25:22