posts_per_page sin límite

11 dic 2011, 17:50:13
Vistas: 269K
Votos: 56

Quiero devolver TODOS los posts con query_posts. Intenté establecer posts_per_page a un número muy alto, pero query_posts se vuelve loco y no devuelve ningún post. ¿Cuál es la forma correcta de consultar posts sin un límite?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );
5
Comentarios

He estado buscando en Google durante un tiempo y en el codex de WP, pero simplemente no puedo encontrar una respuesta directa a esta pregunta tan sencilla. Creo que mi pregunta está formulada claramente con código de ejemplo, y lo que intenté hacer (establecer un valor alto para el argumento). No soy un experto en WP, por eso vine aquí a hacer la pregunta. Incluso proporcionar respuestas a preguntas que parecen triviales para ustedes ayuda a hacer crecer estas comunidades de Stack Exchange. Personalmente, me encanta ver un enlace de Stack Overflow en mis resultados de búsqueda, en lugar de un enlace a un foro de mala calidad.

Banjer Banjer
11 dic 2011 19:50:05

Además, gracias por la respuesta. Deberías publicarla como una respuesta y no como un comentario, para que pueda aceptarla.

Banjer Banjer
11 dic 2011 19:51:24

Entiendo tu punto y agradezco tu esfuerzo al escribir la pregunta. También estoy de acuerdo en que las preguntas de no expertos pueden resultar valiosas en esta comunidad. Por otro lado, demasiadas preguntas de este tipo pueden desanimar a algunos expertos a involucrarse aquí. Se trata de encontrar algún tipo de equilibrio, supongo. De todos modos, soy un gran votante positivo, así que espero con interés tus próximas preguntas :) Que tengas una buena experiencia aquí en WPSE.

Michal Mau Michal Mau
11 dic 2011 20:15:32

PD: también querés reemplazar type por post_type (o eliminar esta línea por completo). Editaré tanto la respuesta de Rutwick como tu pregunta para evitar que alguien copie y pegue este pequeño error.

Michal Mau Michal Mau
11 dic 2011 20:20:34

@Maugly Gracias por la corrección amigo... ¡estaba concentrado en posts_per_page y por eso copié el error tipográfico! ;)

Rutwick Gangurde Rutwick Gangurde
11 dic 2011 21:06:07
Todas las respuestas a la pregunta 6
4
113

-1 es tu respuesta! Busca posts_per_page aquí.

$args = array(
'post_type'      => 'post',
'cat'            => '22,47,67',
'orderby'        => 'name',
'order'          => 'ASC',
'hide_empty'     => 1,
'depth'          => 1,
'posts_per_page' => -1  // Obtiene todos los posts sin límite
);

Advertencia importante: Esto puede resultar en una consulta muy grande que puede derribar el sitio. Hazlo solo si estás seguro de que tu base de datos puede manejarlo. No lo uses en temas o plugins públicos.

11 dic 2011 19:48:59
Comentarios

Advertencia importante: Esto puede resultar en una consulta muy grande que puede derribar el sitio. Hazlo solamente si estás seguro de que tu base de datos puede manejarlo. No en temas o plugins públicos.

fuxia fuxia
11 ago 2016 20:25:08

@toscho Añadiendo tu comentario como una actualización a la respuesta.

Rutwick Gangurde Rutwick Gangurde
23 nov 2016 08:25:37

¡¡me has salvado la vida!!

Darlan Dieterich Darlan Dieterich
11 oct 2019 05:14:14

@DarlanDieterich ¡Me alegra haber podido ayudar! :)

Rutwick Gangurde Rutwick Gangurde
14 oct 2019 10:19:49
0
33

O alternativamente puedes pasar a WP_Query (que es lo que query_posts utiliza) el argumento nopaging, que básicamente hace lo mismo..

$args = array(
    'nopaging' => true
    // Tus otros argumentos, etc..
);

Hará exactamente lo mismo, pero si tienes que revisarlo más tarde y no puedes recordar lo que estabas haciendo, personalmente siento que te quedará más claro cuál era tu intención con ese parámetro dentro del array de argumentos.

Sin embargo, como mencioné, ambos lograrán el mismo resultado.

No está de más tener más de un enfoque, y siempre es bueno compartir lo que sabes, basta decir que esa es la razón de mi respuesta, a pesar de que ya tienes una suficiente.. ;)

12 dic 2011 19:16:58
0

Desde el archivo functions.php de tu tema hijo:

add_action( 'pre_get_posts', 'wpsites_no_limit_posts' );

function wpsites_no_limit_posts( $query ) {

if( $query->is_main_query() && !is_admin() && is_home() ) {

$query->set( 'posts_per_page', '-1' ); // Establece que se muestren todas las entradas
$query->set( 'order', 'ASC' ); // Establece el orden ascendente
$query->set( 'post_type', 'post' ); // Establece el tipo de publicación como 'post'
$query->set( 'cat', '22,47,67' ); // Establece las categorías específicas por ID
$query->set( 'orderby', 'name' ); // Ordena por nombre
$query->set( 'order', 'ASC' ); // Establece nuevamente el orden ascendente
$query->set( 'hide_empty', '1' ); // Oculta categorías vacías
$query->set( 'depth', '1' ); // Establece la profundidad a 1

    }

}
23 feb 2014 05:19:11
1

Usando la modificación de Ricardo:

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Solo devuelve el campo ID para hacer esta consulta más rápida.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // Necesitamos paginación y el recuento de todos los posts encontrados.
        'paged' => $paged,
        'update_post_term_cache' => false,
        'update_post_meta_cache' => false,
    ];
    $query = new WP_Query($defaults);
    if ($query->have_posts()) {
        foreach ($query->posts as $id) {
            $post_ids[] = $id;
        }
    }
} while ($query->max_num_pages > $paged);

return $post_ids;

Esto aumentará dramáticamente la velocidad de la consulta al consultar únicamente la columna ID y evitar la actualización de la caché de términos y metadatos.

18 oct 2019 00:18:06
Comentarios

¡Genial! gracias por compartir.

Ricardo Canelas Ricardo Canelas
19 oct 2019 01:25:29
1

La respuesta correcta para tu problema es 'posts_per_page' => -1 porque -1 devolverá un número ilimitado de entradas por página, como han respondido otros usuarios.

Solo quiero añadir un complemento a esta pregunta y respuesta,

Si quieres obtener el número de entradas por página desde la configuración de lectura en el Panel de Administración de WordPress, tienes que llamar a la función get_option() y pasarle posts_per_page como una cadena de texto.

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => get_option('posts_per_page')
    );

Espero que esta respuesta ayude a alguien como me ayudó a mí. Feliz Codificación Usuarios de Stackexchange

11 ago 2016 19:29:45
Comentarios

¡Eso es realmente una buena adición!

Herbert Van-Vliet Herbert Van-Vliet
29 dic 2017 02:59:12
1

O..

function getAll($arg, $posts_per_page = 50)
{
    $data = array();
    $page = 1;

    do{
        $arg['paged'] = $page;
        $arg['posts_per_page'] = $posts_per_page;

        $query = new WP_Query($arg);

        foreach ($query->posts as $post){
            $data[] = $post;
        }

        $page++;

    }while(count($query->posts) === $posts_per_page);

    return $data;
}
22 feb 2017 12:43:43
Comentarios

Debes agregar contexto para explicar tu código, tu idea para resolver la pregunta.

bueltge bueltge
22 feb 2017 14:25:02