Ist get_posts () effizienter als The Loop?

In category.php möchte ich eine Liste der Beiträge in dieser Kategorie erhalten.

Ich habe zwei Wege gefunden: mit get_posts($args) und The Loop .

get_posts () Weg

 $args = array ( "category" => ID ); $posts = get_posts($args); // then use foreach to loop the $posts 

Der Loop- Weg

   ...   

Also, was ist effizienter?

Von dem, was ich suchte, ist get_posts() für benutzerdefinierte Vorlage, während The Loop in der Vorlage, die WordPress Namenskonvention folgt verwendet wird.

Ich bevorzuge get_posts() aber wenn es einen großen Overhead im Vergleich zu The Loop gibt, sollte ich es noch einmal überdenken.

Solutions Collecting From Web of "Ist get_posts () effizienter als The Loop?"

Wenn WordPress die category.php (genau wie jede andere Vorlage) enthält, wird die Hauptabfrage (dh die durch die URL ausgetriggerse Abfrage) bereits ausgeführt : es bedeutet, dass eine Abfrage auf die database bereits ausgetriggers wurde und dies ist der Grund, warum in einer Vorlage Sie kann den Loop ausführen, ohne eine Abfrage aufzurufen.

Wenn Sie get_posts aufrufen, get_posts Sie eine weitere Abfrage an die database ausgeführt, die komplett unnötig ist, sobald sie mit der bereits von WordPress ausgeführten identisch ist.

Beachten Sie auch, dass get_posts nur ein Wrapper für WP_Query Der Unterschied zur Verwendung der Schleife und zur Verwendung der foreach Syntax betrifft nicht die Abfrage selbst, sondern die Art und Weise, wie Sie das Ergebnis der Abfrage verwenden.

Wenn Sie foreach über while bevorzugen (die Schleife ist nur eine while Schleife), können Sie sie auch direkt WP_Query :

 $q = new WP_Query( $args ); // or $q = get_posts( $args ); foreach ( $q->posts as $post ) { // here your code eg $title = $post->title; $content = $post->content; } 

Warum also normalerweise Menschen den Loop anstelle dieser Art von Schleife verwenden? aus 2 Gründen, mindestens:

  1. Setup des globalen $post Objekts. Wenn Sie the_post() in der Schleife aufrufen, globalisiert diese function die Variable $post die das aktuelle Post-Objekt enthält. Viele corefunktionen und Plugins sind auf diese Variablen angewiesen, so oft ist es wichtig für die Einrichtung. Es kann jedoch auch mit einer foreach-Schleife eingerichtet werden, wobei setup_postdata function setup_postdata der folgende Code verwendet wird:

     global $post; foreach ( $q->posts as $post ) { setup_postdata($post); // here your code eg $title = $post->title; $content = $post->content; } 
  2. Der zweite Grund betrifft Vorlagen-Tags über den direkten Zugriff auf Post-Objekteigenschaften: Wenn Sie the_title oder the_content (oder andere Template-Tags) aufrufen, werden die Filter ausgetriggers, bevor Sie die Eigenschaft ausgeben, und wenn Sie sie nicht aufrufen, kann die Ausgabe nicht die sein eine, die Sie erwarten, wieder kann dies manuell in unserer foreach-Schleife getan werden :

     $q = new WP_Query( $args ); global $post; foreach ( $q->posts as $post ) { setup_postdata($post); // here your code eg $title = apply_filters('the_title', $post->title); $content = apply_filters('the_content', $post->content); } 

Der letzte Codeblock kann als fast identisch mit dem Loop betrachtet werden.

Ich sagte fast, weil es eine andere Sache gibt, die sich unterscheidet: 2 loop_start , loop_start und loop_end , ausgetriggers durch den Loop. Einige Plugins können sie verwenden, also sollten Sie für eine bessere Kompatibilität etwas tun wie:

 $q = new WP_Query( $args ); global $post; do_action_ref_array('loop_start', array(&$q)); foreach ( $q->posts as $post ) { setup_postdata($post); // here your code eg $title = apply_filters('the_title', $post->title); $content = apply_filters('the_content', $post->content); } do_action_ref_array('loop_end', array(&$q)); 

Wie bereits erwähnt, wird dies besser für benutzerdefinierte Schleifen verwendet, aber in Bezug auf die Hauptabfrage ist das Aufrufen einer anderen WP_Query für die performance schlecht und unnötig. Die Hauptabfrage ist jedoch nur eine WP_Query Instanz, die in der globalen Variablen $wp_query ist. Wenn Sie also in Ihrer Vorlage $wp_query tun:

 global $wp_query, $post; do_action_ref_array('loop_start', array(&$wp_query)); foreach ( $wp_query->posts as $post ) { setup_postdata($post); // here your code eg $title = apply_filters('the_title', $post->title); $content = apply_filters('the_content', $post->content); } do_action_ref_array('loop_end', array(&$wp_query)); 

Du machst etwas sehr ähnliches (praktisch identisch) mit dem Loop, nur etwas ausführlicher, aber wenn du while Loops hasst …

Zusammenfassend ist es in Bezug auf Hauptabfrage ratsam, aus Kompatibilitätsgründen (aber nicht zwingend) den Loop zu verwenden: Wenn Sie keine Aktivierung und Filter Hooks auslösen, besteht die Möglichkeit, dass einige von ihnen nicht funktionieren, wenn Sie irgendwelche Plugins installieren …

Bei benutzerdefinierten Schleifen ist es jedoch manchmal nicht erforderlich (oder Sie möchten nicht), Aktionen und Filter-Hooks auszulösen, und in diesen Fällen kann die foreach Syntax vorzuziehen sein.