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

19

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

Estoy familiarizado con WP_Query , y pensé que si establecía posts_per_page en mi límite (es decir, 5), y nopaging a true , se convertiría en algo como " Ok , Te doy solo 5 posts ". Pero esto no funciona.

¿Cómo puedo hacer esto?

    
pregunta EliasNS 18.03.2015 - 11:52

4 respuestas

37

Creo que ahora entiendo lo que estás tratando de hacer. Cuando ejecuta una consulta personalizada con WP_Query y 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 para la En aras de la paginación, WP_Query aún se ejecuta en toda la base de datos y cuenta todas las publicaciones que coinciden con los criterios de la consulta.

Esto se puede ver cuando observa las propiedades $found_posts y $max_num_pages de la consulta. Tomemos un ejemplo:

Tienes 20 publicaciones que pertenecen al tipo de publicación predeterminado post . Solo necesitas las últimas 5 publicaciones 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 publicaciones 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 los sitios con solo unas pocas publicaciones, pero esto puede resultar caro 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 no documentado llamado no_found_rows que usa valores booleanos que puede usar para hacer que su consulta salga de la cuenta después de encontrar las 5 publicaciones que necesita. Esto obligará a WP_Query a no buscar más publicaciones que cumplan los criterios una vez que haya recuperado la cantidad de publicaciones consultadas. Este parámetro ya está integrado en get_posts , por eso get_posts es un poco más rápido que WP_Query , aunque get_posts usa WP_Query

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

    
respondido por el Pieter Goosen 18.03.2015 - 13:22
2

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

La clave es que found_posts me estaba confundiendo. Creo que ese número son las publicaciones recuperadas, pero no lo es. Es el número de publicaciones que coinciden con los criterios . Es como si WP_Query tuviera 2 partes: una para encontrar (todas) las publicaciones y otra para buscar el contenido, cuando comprueba los parámetros pagination . Así que tenemos la propiedad $post_count que es el número de publicaciones recuperadas (Codex dice The number of posts being displayed ), que por supuesto es igual al número en el parámetro posts_per_page , y el número de elementos en la propiedad de matriz $posts .

Así que WP_Query no está haciendo ningún trabajo inútil, como pensé ^^

Espero que esto ayude a otros!

    
respondido por el EliasNS 18.03.2015 - 13:16
2

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
    
respondido por el Shreyo Gi 18.03.2015 - 12:50
0

Ok, te permite tener un tipo de publicación llamado 'blog_posts', y deseas obtener 5 publicaciones de ese tipo de publicación. 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 publicaciones del tipo 'blog_posts', si no es un tipo de publicación personalizada, simplemente reemplaza este 'post_type' => 'posts', si quieres recuperar todas las publicaciones y luego reemplaza este 'posts_per_page' => '-1', , para obtener más detalles WP Query

    
respondido por el shuvroMithun 18.03.2015 - 12:07

Lea otras preguntas en las etiquetas