posts_per_page fără limită

11 dec. 2011, 17:50:13
Vizualizări: 269K
Voturi: 56

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' => ?
    );
5
Comentarii

Am căutat pe Google o perioadă și am parcurs documentația WP codex, dar nu pot găsi un răspuns direct la această întrebare simplă. Cred că întrebarea mea este formulată clar, cu exemple de cod și cu încercarea mea (setând o valoare mare pentru argument). Nu sunt expert în WP, de aceea am venit aici să pun întrebarea. Chiar și oferirea de răspunsuri la întrebări care par triviale pentru voi ajută la dezvoltarea acestor comunități Stack Exchange. Personal, îmi place să văd un link Stack Overflow în rezultatele căutării mele, în loc de un link către un forum de slabă calitate.

Banjer Banjer
11 dec. 2011 19:50:05

De asemenea, mulțumesc pentru răspuns. Ar trebui să îl postezi ca răspuns și nu ca un comentariu, pentru a-l putea accepta.

Banjer Banjer
11 dec. 2011 19:51:24

Am înțeles punctul tău de vedere și apreciez efortul tău în formularea întrebării. Sunt de acord că întrebările de la non-experți pot fi valoroase pentru această comunitate. Pe de altă parte, prea multe astfel de întrebări pot descuraja unii experți să se implice aici. Cred că este vorba despre un fel de echilibru. Oricum, sunt un mare susținător al voturilor pozitive, așa că aștept cu nerăbdare următoarele tale întrebări :) Îți doresc o experiență plăcută aici pe WPSE.

Michal Mau Michal Mau
11 dec. 2011 20:15:32

PS: de asemenea, vrei să înlocuiești type cu post_type (sau să elimini complet această linie). Voi edita atât răspunsul lui Rutwick, cât și întrebarea ta pentru a preveni ca cineva să copieze și să lipească această mică greșeală.

Michal Mau Michal Mau
11 dec. 2011 20:20:34

@Maugly Mulțumesc pentru corectare... m-am concentrat doar pe posts_per_page, de aceea am copiat greșeala de scriere! ;)

Rutwick Gangurde Rutwick Gangurde
11 dec. 2011 21:06:07
Toate răspunsurile la întrebare 6
4
113

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

11 dec. 2011 19:48:59
Comentarii

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.

fuxia fuxia
11 aug. 2016 20:25:08

@toscho Adaug comentariul tău ca o actualizare la răspuns.

Rutwick Gangurde Rutwick Gangurde
23 nov. 2016 08:25:37

mi-ai salvat viața!!

Darlan Dieterich Darlan Dieterich
11 oct. 2019 05:14:14

@DarlanDieterich Mă bucur că am putut să te ajut! :)

Rutwick Gangurde Rutwick Gangurde
14 oct. 2019 10:19:49
0
33

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

12 dec. 2011 19:16:58
0

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

    }

}
23 feb. 2014 05:19:11
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.

18 oct. 2019 00:18:06
Comentarii

Excelent! mulțumesc pentru împărtășire.

Ricardo Canelas Ricardo Canelas
19 oct. 2019 01:25:29
1

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

11 aug. 2016 19:29:45
Comentarii

De fapt, e o adăugare frumoasă!

Herbert Van-Vliet Herbert Van-Vliet
29 dec. 2017 02:59:12
1

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;
}
22 feb. 2017 12:43:43
Comentarii

Ar trebui să adaugi context pentru a explica codul tău și ideea ta de a rezolva întrebarea.

bueltge bueltge
22 feb. 2017 14:25:02