Cum se limitează numărul de articole returnate de WP_Query?

18 mar. 2015, 12:52:15
Vizualizări: 247K
Voturi: 48

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

Exemplu de cod WP_Query cu parametrii posts_per_page și nopaging

Cum pot face acest lucru?

7
Comentarii

Doar 'posts_per_page=5'

Pieter Goosen Pieter Goosen
18 mar. 2015 12:56:47

Folosesc asta, dar găsește toate postările. Dacă accesez proprietatea found_posts, aceasta arată un număr mai mare decât 5. Vreau ca interogarea mea să conțină doar 5 postări. Este posibil? @PieterGoosen

Elías Gómez Elías Gómez
18 mar. 2015 13:03:05

Nu ar trebui să setezi parametrul nopaging, setarea acestuia la true înseamnă că va prelua toate postările

Pieter Goosen Pieter Goosen
18 mar. 2015 13:05:14

@PieterGoosen Dacă nu setez parametrul nopaging acesta preia valoarea implicită care este false, astfel prima pagină afișează 5 postări, dar interogarea conține mai multe. Am adăugat o imagine la întrebare.

Elías Gómez Elías Gómez
18 mar. 2015 13:09:37

Comentariile tale sunt confuze, ai cerut să limitezi numărul de postări afișate pe o pagină la 5, asta și primești. Acum, spui (recitește comentariul tău anterior :-)) că interogarea conține mai multe. Te rog explică. Nu poți seta posts_per_page și apoi să folosești no_paging setat la true în aceeași interogare, este fie posts_per_page SAU nopaging setat la true

Pieter Goosen Pieter Goosen
18 mar. 2015 13:14:11

Întrebarea mea spune "preia". Cred că dacă interogarea conține mai multe postări decât cele afișate, face mai multă muncă decât este necesar. Vreau doar să știu dacă este posibil să evit asta. Nu vreau rezultate navigabile cu o navigare ascunsă.

Elías Gómez Elías Gómez
18 mar. 2015 13:19:43

Interogarea nu va reține mai multe postări decât ai solicitat. Dacă ceri 5, vor fi preluate 5 postări dacă există mai mult de 5 postări care îndeplinesc cerințele. Fă un var_dump() al interogării tale, de exemplu dacă variabila interogării tale este $query, execută var_dump( $query->posts ). Vei vedea doar cele 5 postări pentru care ai făcut interogarea

Pieter Goosen Pieter Goosen
18 mar. 2015 13:26:28
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 4
0
79

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șteptai
  • echo $q->found_posts îți va returna 20
  • echo $q->max_num_pages îți va returna 4

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.

18 mar. 2015 14:22:12
1

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

18 mar. 2015 13:07:02
Comentarii

Vezi comentariile la întrebare, te rog.

Elías Gómez Elías Gómez
18 mar. 2015 13:14:16
4

Ș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
18 mar. 2015 13:50:22
Comentarii

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

Pieter Goosen Pieter Goosen
18 mar. 2015 13:58:09

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.

Elías Gómez Elías Gómez
18 mar. 2015 14:00:29

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?

Shreyo Gi Shreyo Gi
18 mar. 2015 14:22:21

Ar trebui să fie ID, nu id

Pieter Goosen Pieter Goosen
18 mar. 2015 14:25:11
3

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!

18 mar. 2015 14:16:53
Comentarii

Vezi răspunsul meu. Cred că înțeleg ce vrei să spui :-)

Pieter Goosen Pieter Goosen
18 mar. 2015 14:23:23

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!

Elías Gómez Elías Gómez
19 mar. 2015 02:17:48

Gata! Mi-am extins propriul răspuns ^^ @PieterGoosen

Elías Gómez Elías Gómez
19 mar. 2015 16:25:22