posts_per_page nessun limite


41

Voglio restituire TUTTI i post con query_posts. Ho provato a impostare posts_per_pageun numero molto alto, ma query_postsimpazzisce e non restituisce alcun post. Qual è il modo corretto di interrogare i post senza limiti?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );

6
Ho cercato su Google per un po 'di tempo e ho cercato il codice WP, ma non riesco proprio a trovare una risposta diretta a questa semplice domanda. Credo che la mia domanda sia formulata chiaramente con un codice di esempio e quale sia stato il mio tentativo (impostare un valore elevato per l'argomento). Non sono un esperto di WP, quindi è per questo che sono venuto qui per porre la domanda. Anche fornire risposte a domande che ti sembrano banali è utile per far crescere queste community di Stack Exchange. Personalmente adoro vedere un link Stack Overflow nei miei risultati di ricerca, al contrario di un link a un forum scadente.
Banjer,

Inoltre, grazie per la risposta. Dovresti pubblicarlo come una risposta e non come un commento, quindi posso accettarlo.
Banjer,

Ho il tuo punto e apprezzo il tuo impegno nello scrivere la domanda. Concordo anche sul fatto che domande non esperte possano rivelarsi preziose in questa comunità. D'altra parte, troppe di queste domande possono scoraggiare alcuni esperti dal farsi coinvolgere qui. Si tratta di una sorta di equilibrio, immagino. Ad ogni modo, sono un grande votante, quindi non vedo l'ora delle tue prossime domande :) Divertiti qui su WPSE.
Michal Mau,

PS: si vuole anche sostituire typeper post_type(o rimuovere del tutto questa linea). Modificherò sia la risposta di Rutwick sia la tua domanda per impedire a qualcuno di copiare e incollare questo piccolo errore.
Michal Mau,

@Maugly Grazie per la correzione uomo ... mi sono appena concentrato su posts_per_page quindi copiato l'errore di battitura! ;)
Rutwick Gangurde l'

Risposte:


83

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

Avvertenza importante : questo può comportare una query enorme che può far crollare il sito. Fallo solo se sei sicuro che il tuo database possa gestirlo. Non in temi o plugin pubblici.


6
Avvertenza importante: questo può comportare una query enorme che può far crollare il sito. Fallo solo se sei sicuro che il tuo database possa gestirlo. Non in temi o plugin pubblici.
fuxia

@toscho Aggiungendo il tuo commento come aggiornamento alla risposta.
Rutwick Gangurde,

mi salvi la vita !!
Darlan Dieterich,

@DarlanDieterich Sono felice di averti aiutato! :)
Rutwick Gangurde,

24

O in alternativa puoi passare WP_Query(che è ciò che query_postsusa) l' nopagingargomento, che sostanzialmente fa la stessa cosa ..

$args = array(
    'nopaging' => true
    // Your other args, etc..
);

Farà esattamente lo stesso, ma se dovessi ripensarci più tardi e non ricordi cosa stavi facendo, personalmente ritengo che ti sarà più chiaro, che cosa intendevi con quel parametro all'interno degli args array.

Come ho già detto, entrambi realizzeranno comunque lo stesso.

Non può far male avere più di un approccio, ed è sempre bello condividere ciò che sai, basti dire che è la ragione della mia risposta, nonostante tu ne abbia già uno sufficiente ..;)


4

Dal file delle funzioni dei temi 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' );
$query->set( 'order', 'ASC' );
$query->set( 'post_type', 'post' );
$query->set( 'cat', '22,47,67' );
$query->set( 'orderby', 'name' );
$query->set( 'order', 'ASC' );
$query->set( 'hide_empty', '1' );
$query->set( 'depth', '1' );

    }

}

2

Usando Ricardo con qualche modifica:

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Only return the ID field to make this query faster.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // We need pagination & the count for all posts found.
        '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;

Ciò aumenterà notevolmente il tempo di query eseguendo una query solo sulla riga ID ed evitando termini di aggiornamento e meta cache.


Bello! grazie per la condivisione.
Ricardo Canelas,

1

La risposta giusta per il tuo problema è 'posts_per_page' => -1perché -1restituirà un numero illimitato di post per pagina man mano che gli altri utenti rispondono.

Voglio solo aggiungere un componente aggiuntivo a questo Q / A,

Se vuoi ottenere il numero di post per pagina dall'impostazione di lettura sul pannello di amministrazione di WordPress devi chiamare la get_option()funzione e passarci posts_per_pagecome 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 possa aiutare qualcuno in quanto mi aiuta. Happy Coding Stackexchange Users


Questa è in realtà una bella aggiunta!
Herbert Van-Vliet il

1

O..

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

2
Dovresti aggiungere un contesto per spiegare il tuo codice, la tua idea per risolvere la domanda.
fusione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.