Wie kann ich die Anzahl der Posts begrenzen, die WP_Query erhält?

25

Ich habe über Google und WPSE recherchiert und das einzige, was ich immer wieder sehe, ist die Verwendung showposts, die veraltet ist.

Ich bin vertraut mit WP_Query, und ich dachte, wenn ich festgelegt posts_per_pageauf meine Grenze (dh. 5) und nopagingzu true, um es zu so etwas wie werden würde „ Ok, ich gebe Ihnen nur 5 Beiträge “. Das geht aber nicht.

Bildbeschreibung hier eingeben

Wie kann ich das machen?

EliasNS
quelle
Just'posts_per_page=5'
Pieter Goosen
Ich benutze das, aber das hat alle Beiträge gefunden. Wenn ich auf die found_postsEigenschaft zugreife , wird eine höhere Zahl als 5 angegeben. Ich möchte, dass meine Abfrage nur 5 Beiträge enthält. Ist es möglich? @PieterGoosen
EliasNS
Sie sollten den nopagingParameter nicht setzen . Wenn Sie diesen auf true setzen, erhalten Sie alle Posts
Pieter Goosen,
@PieterGoosen Wenn ich den nopagingParameter nicht einstelle , wird der Standardwert übernommen false, sodass auf der Startseite 5 Beiträge angezeigt werden, die Abfrage jedoch mehr. Ich füge der Frage ein Bild hinzu.
EliasNS
Ihre Kommentare sind verwirrend. Sie haben darum gebeten, die Anzahl der auf einer Seite angezeigten Beiträge auf 5 zu beschränken. Jetzt sagst du (lies deinen vorherigen Kommentar noch einmal :-)), die Abfrage enthält mehr. Bitte erkläre. Sie können posts_per_page nicht gesetzt und dann mit no_paging Satz auf true in der gleichen Abfrage, ist es entweder posts_per_page OR nopaging Satz auf true
Pieter Goosen

Antworten:

43

Ich denke, dass ich jetzt verstehe, was Sie versuchen zu tun. Wenn Sie eine benutzerdefinierte Abfrage mit ausführen WP_Queryund das Limit so festlegen, dass nur 5 Posts pro Seite abgerufen werden, werden nur 5 Posts von der Abfrage abgerufen, und diese Abfrage enthält nur 5 Posts, ABER aus Gründen der Paginierung wird WP_Queryimmer noch die gesamte Datenbank durchlaufen und zählt alle Beiträge, die den Kriterien der Abfrage entsprechen.

Dies ist ersichtlich, wenn Sie sich die $found_postsund $max_num_pages-Eigenschaften der Abfrage ansehen . Nehmen wir ein Beispiel:

Sie haben 20 Beiträge, die zum Standardbeitragstyp gehören post. Sie benötigen nur die letzten 5 Beiträge ohne Paginierung. Ihre Anfrage sieht so aus

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) Sie erhalten erwartungsgemäß die letzten 5 Beiträge
  • echo $q->found_posts werde dir geben 20
  • echo $q->max_num_pages werde dir geben 4

Die Auswirkungen dieser zusätzlichen Arbeit sind auf Websites mit nur wenigen Posts minimal. Dies kann jedoch teuer werden, wenn Sie eine Website mit Hunderten oder Tausenden von Posts betreiben. Dies ist eine Verschwendung von Ressourcen, wenn Sie immer nur die 5 neuesten Beiträge benötigen

Es gibt einen undokumentierten Parameter namens, no_found_rowsder boolesche Werte verwendet, mit denen Sie Ihre Abfrage bailen können, nachdem die 5 benötigten Posts gefunden wurden. Dadurch wird WP_Queryerzwungen, nicht mehr nach Posts zu suchen, die die Kriterien erfüllen, nachdem die Anzahl der abgefragten Posts abgerufen wurde. Dieser Parameter ist bereits eingebaut get_posts, deshalb get_postsist er etwas schneller als WP_Queryobwohl er get_postsverwendet wirdWP_Query

Fazit

Wenn Sie keine Paginierung für eine Abfrage verwenden, ist es immer ratsam, 'no_found_rows=true'in Ihrer Abfrage die Dinge zu beschleunigen und Ressourcen zu verschwenden.

Pieter Goosen
quelle
3

Nach dem Gespräch mit @Pieter Goosen über die Kommentare der Frage kann ich die Frage beantworten und meinen Fehler erklären.

Der Schlüssel ist, dass found_postsmich verwirrt hat. Ich denke, diese Nummer ist die Beiträge abgerufen, ist aber nicht. Es ist die Anzahl der Beiträge, die den Kriterien entsprechen . Es ist so, als ob die WP_Queryzwei Teile hatten: einer zum Finden (aller) Beiträge und der andere zum Abrufen des Inhalts, wenn nach den paginationParametern gesucht wird. Wir haben also die $post_countEigenschaft, dass die Anzahl der abgerufenen Posts (laut Codex The number of posts being displayed) gleich der Anzahl der posts_per_pageParameter und der Anzahl der Elemente in der $postsArray-Eigenschaft ist.

Also WP_Querymacht keine unnütze Arbeit, wie ich dachte ^^

Hoffe das hilft anderen!

EliasNS
quelle
Siehe meine Antwort. Ich glaube ich verstehe was du meinst :-)
Pieter Goosen
Ja! Du hast es sehr gut gemacht: D Endlich habe ich es geschafft, und ich verstehe alles = D Danke @PieterGoosen!
EliasNS
Getan! Es erweiterte meine eigene Antwort ^^ @PieterGoosen
EliasNS
1

Ok, Sie können einen Beitragstyp namens "blog_posts" erstellen und 5 Beiträge dieses Beitragstyps abrufen. Hier ist was Sie tun müssen

$args = array(
        'post_type' => 'blog_posts',
        'posts_per_page' => '5',
);


$query = new WP_Query($args);

Die obige Abfrage gibt 5 Posts vom Typ 'blog_posts' zurück. Wenn es sich nicht um einen benutzerdefinierten Post-Typ handelt, ersetzen 'post_type' => 'posts',Sie einfach diese, wenn Sie alle Posts abrufen möchten, und ersetzen Sie diese 'posts_per_page' => '-1',, um weitere Informationen zu erhalten. WP Query

shuvroMithun
quelle
Siehe bitte die Kommentare zu der Frage.
EliasNS
1

Ich weiß, dass @ user1750063 den Code erwähnt hat, aber versuchen Sie dies

$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();
        // display content
    }
} else {
    // display when no posts found
}

wp_reset_postdata();     // Restore original Post Data
Shreyo Gi
quelle
idist als orderbyWert ungültig und paginationist ein ungültiger Parameter
Pieter Goosen
paginationist kein gültiger Parameter. Du meinst 'nopaging' => true? Wenn ja, dann bekomme ich ALLE Beiträge. Das ist nicht was ich will. @PieterGoosen Ich denke er meint ID.
EliasNS
orderby dient zum Anzeigen der Bestellung, oder? Der NOPAGING-Wert / -Parameter wird dadurch nicht beeinträchtigt. @PieterGoosen warum ist ID & orderby ungültig? Können Sie den Punkt klarstellen?
Shreyo Gi
Es sollte IDnicht seinid
Pieter Goosen