posts_per_page sin límite

41

Quiero devolver TODAS las publicaciones con query_posts. Intenté establecer posts_per_pageun número realmente alto, pero query_postsenloquece y no devuelve ninguna publicación. ¿Cuál es la forma correcta de consultar publicaciones sin límite?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );
Banjer
fuente
66
He estado buscando en Google por un tiempo y buscando el códice WP, pero simplemente no puedo encontrar una respuesta directa a esta simple pregunta. Creo que mi pregunta está redactada claramente con un código de ejemplo y cuál fue mi intento (establecer un valor alto para el argumento). No soy un experto en WP, por eso vine aquí para hacer la pregunta. Incluso proporcionar respuestas a preguntas que le parezcan triviales es útil para hacer crecer estas comunidades de Stack Exchange. Personalmente, me encanta ver un enlace de desbordamiento de pila en mis resultados de búsqueda, en lugar de un enlace a un foro horrible.
Banjer
Además, gracias por la respuesta. Debes publicarlo como respuesta y no como comentario, para que pueda aceptarlo.
Banjer
Comprendo su punto y aprecio su esfuerzo al escribir la pregunta. También estoy de acuerdo en que las preguntas no expertas pueden resultar valiosas en esta comunidad. Por otro lado, muchas de estas preguntas pueden desanimar a algunos expertos a involucrarse aquí. Se trata de algún tipo de equilibrio, supongo. De todos modos, soy un gran votante, así que espero sus próximas preguntas :) Diviértase aquí en WPSE.
Michal Mau
PS: También desea reemplazar typepor post_type(o eliminar esta línea en total). Editaré tanto la respuesta de Rutwick como su pregunta para evitar que alguien copie este pequeño error.
Michal Mau
@Maugly Gracias por el hombre de corrección ... solo se centró en posts_per_page, ¡por lo tanto, copié el error tipográfico! ;)
Rutwick Gangurde

Respuestas:

83

-1 es tu respuesta! Busque 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
);

Advertencia importante : esto puede resultar en una consulta muy grande que puede hacer que el sitio se caiga. Haga esto solo si está seguro de que su base de datos puede manejarlo. No en temas públicos o complementos.

Rutwick Gangurde
fuente
66
Advertencia importante: esto puede resultar en una consulta muy grande que puede hacer que el sitio se caiga. Haga esto solo si está seguro de que su base de datos puede manejarlo. No en temas públicos o complementos.
fuxia
@toscho Agregando su comentario como una actualización de la respuesta.
Rutwick Gangurde
¡¡salvas mi vida!!
Darlan Dieterich
@DarlanDieterich ¡Me alegra haber podido ayudar! :)
Rutwick Gangurde
24

O, alternativamente, puede pasar WP_Query(que es lo que query_postsusa) el nopagingargumento, que básicamente hace lo mismo ...

$args = array(
    'nopaging' => true
    // Your other args, etc..
);

Hará exactamente lo mismo, pero si tiene que volver a mirarlo más tarde y no puede recordar lo que estaba haciendo, personalmente creo que será más claro para usted, qué es lo que pretendía con ese parámetro dentro de los argumentos formación.

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

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

t31os
fuente
4

Desde el archivo de funciones de temas secundarios:

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' );
$query->set( 'order', 'ASC' );
$query->set( 'post_type', 'post' );
$query->set( 'cat', '22,47,67' );
$query->set( 'orderby', 'name' );
$query->set( 'order', 'ASC' );
$query->set( 'hide_empty', '1' );
$query->set( 'depth', '1' );

    }

}
Brad Dalton
fuente
2

Usando Ricardo's con alguna modificación:

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Only return the ID field to make this query faster.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // We need pagination & the count for all posts found.
        '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á drásticamente el tiempo de consulta al consultar solo en la fila de ID y evitar la actualización de términos y meta caché.

Austin Passy
fuente
¡Agradable! gracias por compartir.
Ricardo Canelas
1

La respuesta correcta para su problema es 'posts_per_page' => -1porque -1devolverá publicaciones ilimitadas por página a medida que respondan los demás usuarios.

Solo quiero agregar un complemento a este Q / A,

Si desea obtener el número de publicaciones por página desde la configuración de lectura en el Panel de administración de WordPress, debe llamar a la get_option()función y pasarla posts_per_pagecomo una cadena.

$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 ayuda a mí. Usuarios felices de Stackexchange de codificación

Elkhouaja
fuente
Eso es realmente una buena adición!
Herbert Van-Vliet
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;
}
Ricardo Canelas
fuente
2
Debe agregar contexto para explicar su código, su idea para resolver la pregunta.
bueltge