Cum se limitează numărul de articole returnate de WP_Query?
Am căutat pe Google și WPSE și singurul lucru pe care îl văd în mod repetat este utilizarea showposts
, care este depreciat.
Sunt familiarizat cu WP_Query
, și am crezut că dacă setez posts_per_page
la limita dorită (de ex. 5), și nopaging
la true
, ar rezulta ceva de genul "Ok, îți voi da doar 5 articole". Dar acest lucru nu funcționează.
Cum pot face acest lucru?

Cred că acum înțeleg ce încerci să faci. Când rulezi o interogare personalizată cu WP_Query
și setezi limita pentru a obține doar 5 articole pe pagină, doar 5 articole vor fi recuperate de interogare și acea interogare va conține doar 5 articole, DAR pentru paginare, WP_Query
încă parcurge întreaga bază de date și numără toate articolele care corespund criteriilor interogării.
Acest lucru poate fi văzut când te uiți la proprietățile $found_posts
și $max_num_pages
ale interogării. Să luăm un exemplu:
Ai 20 de articole aparținând tipului implicit de postare post
. Ai nevoie doar de ultimele 5 articole fără paginare. Interogarea ta arată astfel:
$q = new WP_Query( 'posts_per_page=5' );
var_dump( $q->posts )
îți va returna ultimele 5 articole așa cum te așteptaiecho $q->found_posts
îți va returna20
echo $q->max_num_pages
îți va returna4
Impactul acestei munci suplimentare este minim pe site-urile cu doar câteva articole, dar poate deveni costisitor dacă administrezi un site cu sute sau mii de articole. Aceasta este o risipă de resurse dacă vei avea nevoie doar de ultimele 5 articole.
Există un parametru nedocumentat numit no_found_rows
care utilizează valori booleene și pe care îl poți folosi pentru a face interogarea să se oprească după ce a găsit cele 5 articole de care ai nevoie. Acest lucru va forța WP_Query
să nu mai caute alte articole care corespund criteriilor după ce a recuperat numărul de articole solicitat. Acest parametru este deja integrat în get_posts
, de aceea get_posts
este puțin mai rapid decât WP_Query
deși get_posts
utilizează WP_Query
Concluzie
În concluzie, dacă nu vei folosi paginarea într-o interogare, este întotdeauna înțelept să folosești 'no_found_rows=true'
în interogarea ta pentru a accelera lucrurile și pentru a economisi resurse.

Ok, să presupunem că ai un tip de postare numit 'blog_posts' și vrei să preiei 5 postări din acel tip de postare. Iată ce trebuie să faci
$args = array(
'post_type' => 'blog_posts',
'posts_per_page' => '5',
);
$query = new WP_Query($args);
Interogarea de mai sus va returna 5 postări de tipul 'blog_posts'. Dacă nu este un tip de postare personalizat, atunci înlocuiește astfel 'post_type' => 'posts',
. Dacă dorești să preiei toate postările, atunci înlocuiește astfel 'posts_per_page' => '-1',
. Pentru mai multe detalii consultă WP Query

Știu că @user1750063 a menționat codul, dar încearcă acest exemplu
$args = array (
'post_type' => 'custom_post',
'nopaging' => false,
'posts_per_page' => '5',
'order' => 'DESC',
'orderby' => 'ID',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// afișează conținutul
}
} else {
// afișează când nu sunt găsite articole
}
wp_reset_postdata(); // Restaurează Datele Postării originale

id
este invalid ca valoare pentru orderby
și pagination
este un parametru invalid

pagination
nu este un parametru valid. Te referi la 'nopaging' => true
? Dacă da, atunci voi obține TOATE postările. Nu asta doresc. @PieterGoosen Cred că se referă la ID
.

orderby este pentru afișarea ordinii, corect? Nu afectează valoarea/parametrul nopaging.
@PieterGoosen de ce sunt ID și orderby invalide? Poți clarifica acest aspect?

După conversația cu @Pieter Goosen din comentariile întrebării, cred că pot răspunde la întrebare și explica greșeala mea.
Cheia este că found_posts
mă inducea în eroare. Am crezut că acel număr reprezintă postările recuperate, dar nu este așa. Este numărul de postări care corespund criteriilor. Este ca și cum WP_Query
ar avea 2 părți: una pentru găsirea (tuturor) postărilor și alta pentru preluarea conținutului, când verifică parametrii de paginare
. Astfel, avem proprietatea $post_count
care reprezintă numărul de postări preluate (Codex spune Numărul de postări care sunt afișate
), care bineînțeles este egal cu numărul din parametrul posts_per_page
și cu numărul de elemente din array-ul proprietății $posts
.
Deci WP_Query
nu face nicio muncă inutilă, așa cum am crezut ^^
Sper că acest lucru îi ajută și pe alții!

Da! Ai făcut-o foarte bine :D În sfârșit am găsit calea de a o face și înțeleg totul =D Mulțumesc @PieterGoosen!
