posts_per_page fără limită
Vreau să returnez TOATE postările cu query_posts
. Am încercat să setez posts_per_page
la un număr foarte mare, dar query_posts
se blochează și nu returnează niciun post. Care este modul corect de a interoga postări fără limită?
$args = array(
'post_type' => 'post',
'cat' => '22,47,67',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'depth' => 1,
'posts_per_page' => ?
);

-1 este răspunsul tău! Caută posts_per_page
aici.
$args = array(
'post_type' => 'post',
'cat' => '22,47,67',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'depth' => 1,
'posts_per_page' => -1
);
Avertisment important: Acest lucru poate duce la o interogare foarte mare care poate afecta funcționarea site-ului. Faceți acest lucru doar dacă sunteți sigur că baza de date poate gestiona. Nu în teme sau plugin-uri publice.

Atenționare importantă: Aceasta poate rezulta într-o interogare foarte mare care poate face site-ul să cadă. Faceți acest lucru doar dacă sunteți sigur că baza dvs. de date poate gestiona situația. Nu în teme sau plugin-uri publice.

Sau alternativ, poți transmite WP_Query
(care este ceea ce folosește query_posts
) argumentul nopaging
, care face practic același lucru..
$args = array(
'nopaging' => true
// Celelalte argumente ale tale, etc..
);
Va face exact același lucru, dar dacă trebuie să revezi codul mai târziu și nu-ți poți aminti ce făceai, personal cred că îți va fi mai clar care era intenția ta cu acel parametru din interiorul array-ului de argumente.
După cum am menționat totuși, ambele vor realiza de fapt același lucru.
Nu strică să ai mai multe abordări, și este întotdeauna frumos să împărtășești ceea ce știi, prin urmare acesta este motivul răspunsului meu, deși ai primit deja unul suficient.. ;)

Din fișierul functions.php al temei copil:
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' ); // Setează pentru a afișa toate articolele, fără limită
$query->set( 'order', 'ASC' ); // Setează ordinea ca ascendentă
$query->set( 'post_type', 'post' ); // Setează tipul de postare ca "post"
$query->set( 'cat', '22,47,67' ); // Setează categoriile specifice prin ID-uri
$query->set( 'orderby', 'name' ); // Ordonează după nume
$query->set( 'order', 'ASC' ); // Setează din nou ordinea ca ascendentă
$query->set( 'hide_empty', '1' ); // Ascunde categoriile goale
$query->set( 'depth', '1' ); // Setează adâncimea la 1
}
}

Folosind codul lui Ricardo cu unele modificări:
static $paged;
$post_ids = [];
do {
$paged++;
$defaults = [
'fields' => 'ids', // Returnează doar câmpul ID pentru a face interogarea mai rapidă
'post_type' => 'post',
'posts_per_page' => 100,
'no_found_rows' => false, // Avem nevoie de paginare și numărul total de articole găsite
'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;
Acest cod va crește dramatic viteza interogării prin faptul că face query doar pentru coloana ID și evită actualizarea cache-ului pentru termeni și metadate.

Răspunsul corect pentru problema ta este 'posts_per_page' => -1
deoarece -1
va returna un număr nelimitat de articole pe pagină, așa cum au răspuns și ceilalți utilizatori.
Vreau doar să adaug un supliment la această întrebare și răspuns,
Dacă dorești să obții numărul de articole pe pagină din setările de citire din Panoul de Administrare WordPress, trebuie să apelezi funcția get_option()
și să pasezi posts_per_page
ca string către aceasta.
$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')
);
Sper că acest răspuns va ajuta pe cineva, așa cum m-a ajutat și pe mine. Programare plăcută utilizatorilor Stackexchange

Sau..
// Funcție pentru a obține toate înregistrările cu paginare
function getAll($arg, $posts_per_page = 50)
{
$data = array();
$page = 1;
do{
$arg['paged'] = $page;
$arg['posts_per_page'] = $posts_per_page;
// Creează o nouă interogare WP_Query
$query = new WP_Query($arg);
// Parcurge fiecare articol și îl adaugă în array-ul de date
foreach ($query->posts as $post){
$data[] = $post;
}
$page++;
}while(count($query->posts) === $posts_per_page);
return $data;
}
