posts_per_page sin límite
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' => ?
);

-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.

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.

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

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.. ;)

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
}
}

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.

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

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;
}
