posts_per_page no limit

41

Ich möchte ALLE Beiträge mit zurückgeben query_posts. Ich habe versucht posts_per_page, eine wirklich hohe Zahl query_postseinzustellen, bin jedoch ausgeflippt und habe keine Beiträge zurückgegeben. Was ist der richtige Weg, um Posts ohne Limit abzufragen?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );
Banjer
quelle
6
Ich habe eine Weile gegoogelt und den WP-Codex durchsucht, aber ich kann einfach keine direkte Antwort auf diese einfache Frage finden. Ich glaube, meine Frage ist klar formuliert mit Beispielcode und was mein Versuch war (einen hohen Wert für das Argument festlegen). Ich bin kein WP-Experte, deshalb bin ich hergekommen, um die Frage zu stellen. Selbst wenn Sie Antworten auf Fragen geben, die Ihnen trivial erscheinen, können Sie diese Stack Exchange-Communitys erweitern. Ich persönlich mag es, einen Link zum Stapelüberlauf in meinen Suchergebnissen zu sehen, im Gegensatz zu einem Link zu einem beschissenen Forum.
Banjer
Danke auch für die Antwort. Sie sollten es als Antwort und nicht als Kommentar posten, damit ich es akzeptieren kann.
Banjer
Ich verstehe, worum es geht, und ich weiß Ihre Mühe zu schätzen , die Frage zu schreiben . Ich stimme auch zu, dass sich Fragen, die keine Experten sind, in dieser Community als nützlich erweisen können. Andererseits können zu viele solcher Fragen einige Experten davon abhalten, sich hier einzumischen. Es geht wohl um eine Art Gleichgewicht. Wie auch immer, ich bin ein großer Wähler und freue mich auf Ihre nächsten Fragen :) Ich wünsche Ihnen eine tolle Zeit hier auf WPSE.
Michal Mau
PS: Sie wollen auch ersetzen , typefür post_type(oder diese Zeile ganz entfernen). Ich werde sowohl die Antwort von Rutwick als auch Ihre Frage bearbeiten, um zu verhindern, dass jemand diesen kleinen Fehler kopiert.
Michal Mau
@Maugly Danke für den Korrekturmann ... habe mich nur auf posts_per_page konzentriert und daher den Tippfehler kopiert! ;)
Rutwick Gangurde

Antworten:

81

-1 ist deine Antwort! Schauen Sie posts_per_page hier .

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

Wichtiger Vorbehalt : Dies kann zu einer sehr großen Abfrage führen, die die Site zum Absturz bringen kann. Tun Sie dies nur, wenn Sie sicher sind, dass Ihre Datenbank damit umgehen kann. Nicht in öffentlichen Themen oder Plugins.

Rutwick Gangurde
quelle
6
Wichtige Einschränkung: Dies kann zu einer sehr großen Abfrage führen, die die Site zum Absturz bringen kann. Tun Sie dies nur, wenn Sie sicher sind, dass Ihre Datenbank damit umgehen kann. Nicht in öffentlichen Themen oder Plugins.
fuxia
@toscho Hinzufügen Ihres Kommentars als Update zur Antwort.
Rutwick Gangurde
du rettest mein Leben!!
Darlan Dieterich
@DarlanDieterich Ich bin froh, dass ich helfen konnte! :)
Rutwick Gangurde
23

Oder alternativ können Sie das Argument übergeben WP_Query(was query_postsverwendet wird) nopaging, was im Grunde das Gleiche tut.

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

Es wird genau das Gleiche tun, aber wenn Sie später noch einmal darauf zurückblicken müssen und sich nicht erinnern können, was Sie getan haben, wird Ihnen persönlich klarer, was Sie mit diesem Parameter innerhalb der Argumente beabsichtigt haben Array.

Wie ich bereits erwähnte, werden beide das gleiche erreichen.

Es kann nicht schaden, mehr als einen Ansatz zu haben, und es ist immer schön zu teilen, was Sie wissen. Es reicht zu sagen, dass dies der Grund für meine Antwort ist, obwohl Sie bereits einen ausreichenden haben.

t31os
quelle
3

Aus der Funktionsdatei Ihres untergeordneten Themes:

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

    }

}
Brad Dalton
quelle
1

Die richtige Antwort für Ihr Problem ist, 'posts_per_page' => -1dass -1unbegrenzt viele Beiträge pro Seite zurückgegeben werden, wenn die anderen Benutzer antworten.

Ich möchte nur ein Add-On zu dieser Frage / Antwort hinzufügen.

Wenn Sie die Anzahl der Beiträge pro Seite aus der Leseeinstellung in WordPress Administration Panel abrufen möchten, müssen Sie die get_option()Funktion aufrufen und posts_per_pageals Zeichenfolge übergeben.

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

Ich hoffe, dass diese Antwort jemandem hilft, wie es mir hilft. Happy Coding Stackexchange Benutzer

Elkhouaja
quelle
Das ist eigentlich eine schöne Ergänzung!
Herbert Van-Vliet
1

Oder..

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;
}
Ricardo Canelas
quelle
2
Sie sollten Kontext hinzufügen, um Ihren Code zu erklären, und Ihre Idee, um die Frage zu lösen.
Bueltge
1

Verwenden von Ricardo mit einigen Änderungen:

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;

Dadurch wird die Abfragezeit erheblich verlängert, da nur die ID-Zeile abgefragt wird und die Aktualisierung von Begriff und Meta-Cache vermieden wird.

Austin Passy
quelle
Nett! danke für das Teilen.
Ricardo Canelas