posts_per_page senza limite
Voglio restituire TUTTI i post con query_posts
. Ho provato a impostare posts_per_page
a un numero molto alto, ma query_posts
impazzisce e non restituisce alcun post. Qual è il modo corretto per eseguire query sui post senza un limite?
$args = array(
'post_type' => 'post',
'cat' => '22,47,67',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'depth' => 1,
'posts_per_page' => ?
);

-1 è la tua risposta! Cerca posts_per_page
qui.
$args = array(
'post_type' => 'post',
'cat' => '22,47,67',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'depth' => 1,
'posts_per_page' => -1
);
Importante avvertenza: Questo può risultare in una query molto pesante che può mandare in crash il sito. Fallo solo se sei sicuro che il tuo database possa gestirlo. Non usarlo in temi o plugin pubblici.

Avvertenza importante: Questo può risultare in una query molto grande che può mandare in crash il sito. Fallo solo se sei sicuro che il tuo database possa gestirla. Non usarlo in temi o plugin pubblici.

@toscho Aggiungo il tuo commento come aggiornamento alla risposta.

Oppure, in alternativa, puoi passare a WP_Query
(che è ciò che query_posts
utilizza) l'argomento nopaging
, che fondamentalmente fa la stessa cosa..
$args = array(
'nopaging' => true
// I tuoi altri argomenti, ecc..
);
Otterrà esattamente lo stesso risultato, ma se in futuro dovrai rivedere il codice e non ricordi cosa stavi facendo, personalmente ritengo che sarà più chiaro per te capire quale fosse l'intenzione con quel parametro all'interno dell'array args.
Come ho menzionato, tuttavia, entrambi i metodi ottengono lo stesso risultato.
Non fa mai male avere più di un approccio, ed è sempre bello condividere ciò che sai; questo è il motivo della mia risposta, nonostante tu ne abbia già una sufficiente.. ;)

Dal file functions del tuo tema figlio:
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' ); // Imposta per visualizzare tutti i post senza limite
$query->set( 'order', 'ASC' ); // Imposta l'ordinamento crescente
$query->set( 'post_type', 'post' ); // Imposta il tipo di contenuto a 'post'
$query->set( 'cat', '22,47,67' ); // Filtra per le categorie con ID 22, 47 e 67
$query->set( 'orderby', 'name' ); // Ordina per nome
$query->set( 'order', 'ASC' ); // Imposta nuovamente l'ordinamento crescente
$query->set( 'hide_empty', '1' ); // Nascondi le categorie vuote
$query->set( 'depth', '1' ); // Imposta la profondità a 1
}
}

Usando Ricardo's con alcune modifiche:
static $paged;
$post_ids = [];
do {
$paged++;
$defaults = [
'fields' => 'ids', // Restituisce solo il campo ID per rendere la query più veloce.
'post_type' => 'post',
'posts_per_page' => 100,
'no_found_rows' => false, // Abbiamo bisogno della paginazione e del conteggio di tutti i post trovati.
'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;
Questo aumenterà drasticamente la velocità della query interrogando solo la colonna ID ed evitando di aggiornare la cache dei termini e dei meta.

La risposta corretta per il tuo problema è 'posts_per_page' => -1
perché -1
restituirà un numero illimitato di post per pagina come hanno risposto gli altri utenti.
Voglio solo aggiungere un'informazione a questa domanda e risposta,
Se vuoi ottenere il numero di post per pagina dalle impostazioni di lettura nel Pannello di Amministrazione di WordPress, devi chiamare la funzione get_option()
e passarle posts_per_page
come stringa.
$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')
);
Spero che questa risposta aiuterà qualcuno come ha aiutato me. Buona Programmazione Utenti di Stackexchange

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