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