¿Cómo limitar el número de publicaciones que recibe WP_Query?


25

He estado investigando en Google y WPSE y lo único que veo repetidamente es usar showposts, eso está en desuso.

Estoy familiarizado con WP_Query, y pensé que si me puse posts_per_pagea mi límite (es decir. 5), y nopagingque true, se convertiría en algo como " Ok, te voy a dar sólo 5 mensajes ". Pero esto no funciona.

ingrese la descripción de la imagen aquí

¿Cómo puedo hacer esto?


Just'posts_per_page=5'
Pieter Goosen

Lo uso, pero eso encontró todas las publicaciones. Si accedo a la found_postspropiedad, dice un número mayor que 5. Quiero que mi consulta contenga solo 5 publicaciones. ¿Es posible? @PieterGoosen
EliasNS

No debe establecer el nopagingparámetro, establecerlo en verdadero significa obtener todas las publicaciones
Pieter Goosen

@PieterGoosen Si no configuro el nopagingparámetro, se obtiene el valor predeterminado false, por lo que la portada muestra 5 publicaciones, pero la consulta contiene más. Agrego una imagen a la pregunta.
EliasNS

Sus comentarios son confusos, solicitó limitar la cantidad de publicaciones que se muestran en una página a 5, eso es lo que obtiene. Ahora, usted dice (relee su comentario anterior :-)) la consulta tiene más. Por favor explique. No puede establecer posts_per_page y luego usar no_paging set en true en la misma consulta, es posts_per_page O nopaging set en true
Pieter Goosen

Respuestas:


43

Creo que ahora entiendo lo que estás tratando de hacer. Cuando ejecuta una consulta personalizada WP_Queryy establece el límite para obtener solo 5 publicaciones por página, la consulta solo recuperará 5 publicaciones y esa consulta solo contendrá 5 publicaciones, PERO en aras de la paginación, WP_Querytodavía se ejecuta en toda la base de datos y cuenta todas las publicaciones que coinciden con los criterios de la consulta.

Eso se puede ver cuando observa las propiedades $found_postsy $max_num_pagesde la consulta. Tomemos un ejemplo:

Tiene 20 publicaciones que pertenecen al tipo de publicación predeterminado post. Usted solamente necesita los últimos 5 mensajes sin paginación. Su consulta se ve así

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) le dará las últimas 5 publicaciones como se esperaba
  • echo $q->found_posts Te regalaré 20
  • echo $q->max_num_pages Te regalaré 4

El impacto de este trabajo adicional es mínimo en sitios con solo unas pocas publicaciones, pero esto puede ser costoso si está ejecutando un sitio con cientos o miles de publicaciones. Esto es un desperdicio de recursos si solo vas a necesitar las 5 últimas publicaciones

Hay un parámetro indocumentado llamado no_found_rowsque utiliza valores booleanos que puede usar para hacer que su consulta salga después de encontrar las 5 publicaciones que necesita. Esto forzará a WP_Queryno buscar más publicaciones sobre los criterios después de que haya recuperado la cantidad de publicaciones consultadas. Este parámetro ya está integrado get_posts, es por eso que get_postses un poco más rápido que WP_Queryaunque get_postsusaWP_Query

Conclusión

En conclusión, si no va a utilizar la paginación en una consulta, siempre es aconsejable 'no_found_rows=true'en su consulta acelerar las cosas y ahorrar en el desperdicio de recursos.


3

Después de la conversación con @Pieter Goosen sobre los comentarios de la pregunta, creo que puedo responderla y explicar mi error.

La clave es que found_postsme estaba confundiendo. Creo que ese número son las publicaciones recuperadas pero no lo es. Es la cantidad de publicaciones que coinciden con los criterios . Es como si WP_Querytuvieran 2 partes: una para encontrar (todas) las publicaciones y otra para buscar el contenido, cuando verifica los paginationparámetros. Entonces, tenemos la $post_countpropiedad que es el número de publicaciones recuperadas (dice el Codex The number of posts being displayed), que por supuesto es igual al número en el posts_per_pageparámetro y el número de elementos en la $postspropiedad de matriz.

Entonces WP_Queryno está haciendo ningún trabajo inútil, como pensé ^^

Espero que esto ayude a otros!


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

¡Sí! Lo hiciste muy bien: D Finalmente conseguí la forma de hacerlo, y entiendo todo = D ¡Gracias @PieterGoosen!
EliasNS

¡Hecho! Extendió mi propia respuesta ^^ @PieterGoosen
EliasNS

1

Ok, le permite tener un tipo de publicación llamado 'blog_posts', y desea obtener 5 publicaciones de ese tipo de publicación. Aquí está lo que tú necesitas hacer

$args = array(
        'post_type' => 'blog_posts',
        'posts_per_page' => '5',
);


$query = new WP_Query($args);

La consulta anterior devolverá 5 publicaciones del tipo 'blog_posts', si no es un tipo de publicación personalizado, simplemente reemplace de esta manera 'post_type' => 'posts',si desea recuperar todas las publicaciones y luego reemplace de esta manera 'posts_per_page' => '-1',, para más detalles Consulta WP


Vea los comentarios sobre la pregunta, por favor.
EliasNS

1

Sé que @ user1750063 ha mencionado el código pero intente esto

$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

idno es válido como orderbyvalor y paginationes un parámetro no válido
Pieter Goosen

paginationNo es un parámetro válido. Quieres decir 'nopaging' => true? En caso afirmativo, obtendré TODAS las publicaciones. Eso no es lo que quiero. @PieterGoosen Creo que quiere decir ID.
EliasNS

orderby es para mostrar el pedido, ¿verdad? No daña el valor / parámetro de nopaging. @PieterGoosen ¿por qué la ID y el pedido no son válidos? ¿Puedes aclarar el punto?
Shreyo Gi

Debería ser ID, noid
Pieter Goosen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.