it-swarm.com.de

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

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

Ich kenne mich mit WP_Query aus und dachte, wenn ich posts_per_page auf mein Limit (dh 5) und nopaging auf true setze, würde es zu so etwas wie " Ok, ich gebe dir nur 5 Beiträge " . Das geht aber nicht.

enter image description here

Wie kann ich das machen?

23
EliasNS

Ich denke, dass ich jetzt verstehe, was Sie versuchen zu tun. Wenn Sie eine benutzerdefinierte Abfrage mit WP_Query ausführen und das Limit auf 5 Posts pro Seite festlegen, werden nur 5 Posts von der Abfrage abgerufen und diese Abfrage enthält nur 5 Posts,ABERaus Gründen der Paginierung , WP_Query durchläuft weiterhin die gesamte Datenbank und zählt alle Posts, die den Kriterien der Abfrage entsprechen.

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

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

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) gibt Ihnen erwartungsgemäß die letzten 5 Beiträge
  • echo $q->found_posts gibt dir 20
  • echo $q->max_num_pages gibt dir 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_rows, der boolesche Werte verwendet, die Sie verwenden können, um Ihre Abfrage freizugeben, nachdem die 5 benötigten Beiträge gefunden wurden. Dadurch wird WP_Query gezwungen, nicht mehr nach Posts zu suchen, die die Kriterien erfüllen, nachdem die Anzahl der abgefragten Posts abgerufen wurde. Dieser Parameter ist bereits in get_posts integriert. Aus diesem Grund ist get_posts etwas schneller als WP_Query, obwohl get_postsWP_Query verwendet.

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

38
Pieter Goosen

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
2
Shreyo Gi

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_posts mich 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, als hätte der WP_Query zwei Teile: einen zum Finden (aller) Beiträge und einen zum Abrufen des Inhalts, wenn er nach den pagination-Parametern sucht. Wir haben also die Eigenschaft $post_count, die die Anzahl der abgerufenen Posts angibt (Codex sagt The number of posts being displayed), die natürlich der Anzahl des Parameters posts_per_page und der Anzahl der Elemente in der Array-Eigenschaft $posts entspricht.

Also macht WP_Query keine nutzlose Arbeit, wie ich dachte ^^

Hoffe das hilft anderen!

2
EliasNS

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

$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 Sie einfach diesen 'post_type' => 'posts',. Wenn Sie alle Posts abrufen möchten, ersetzen Sie diesen 'posts_per_page' => '-1',, um weitere Informationen zu erhalten. WP Abfrage

1
shuvroMithun