Wann sollten Sie wp_query vs query_posts () vs get_posts () verwenden?
-
16-10-2019 - |
Frage
Es scheint die Hälfte der Tutorials in der Kodex und rund um die Blogosphäre verwendet query_posts()
und halbgebrauch WP_Query
. Was ist das Problem?
Lösung
query_posts()
ist übermäßig simpel und eine problematische Möglichkeit, die Hauptabfrage einer Seite zu ändern, indem sie durch neue Instanz der Abfrage ersetzt wird. Es ist ineffizient (Runs SQL-Abfragen erneut) und scheitert unter bestimmten Umständen (insbesondere bei der Bearbeitung von Posts Pagination). Jeder moderne WP -Code sollte zuverlässigere Methoden verwenden, z. B. die Verwendung despre_get_posts
Haken zu diesem Zweck. Tl; dr Verwenden Sie niemals query_posts () jemals.get_posts()
ist in der Verwendung sehr ähnlich und akzeptiert dieselben Argumente (mit einigen Nuancen, wie unterschiedlichen Standardeinstellungen), gibt jedoch eine Reihe von Beiträgen zurück, ändert keine globalen Variablen und ist überall sicher.WP_Query
ist die Klasse, die beide hinter den Kulissen versorgt, aber Sie können auch Ihre eigene Instanz erstellen und arbeiten. Ein bisschen komplexer, weniger Einschränkungen, auch überall sicher zu verwenden.
Andere Tipps
query_posts
- Sie sollten niemals benutzen query_posts
. Abgesehen von dem, was @rarst gesagt hat, das wirklich große Problem mit query_posts
ist das Hauptanfrageobjekt (gespeichert in $wp_query
). Viele Plugins und benutzerdefinierte Code stützen sich auf das Hauptanfragungsobjekt. Daher brechen Sie das Hauptabfrageobjekt, dass Sie die Funktionen von Plugins und benutzerdefiniertem Code brechen. Nur eine solche Funktion ist die alles wichtige Paginierungsfunktion. Wenn Sie also die Hauptanfrage brechen, brechen Sie Pagination.
Um zu beweisen, wie schlimm query_posts
IS, in jeder Vorlage, Folgendes machen und die Ergebnisse vergleichen
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
und WP_Query
sind die richtige Art zu konstruieren sekundär Abfragen ( Wie verwandte Beiträge, Schieberegler, vorgestellte Inhalte und Inhalt auf statischen Titelseiten ) mit. Es sollte beachtet werden, dass Sie keine der beiden zugunsten der Hauptabfrage auf der Homepage, einer einzelnen Seite oder einer Archiv -Seite verwenden sollten, da sie die Funktionsfunktionalität des Brechens brechen. Wenn Sie die Hauptabfrage ändern müssen, verwenden Sie pre_get_posts
dazu und keine benutzerdefinierte Abfrage. (AKTUALISIEREN: Für statische Titelseiten und wahre Seiten siehe Verwenden von pre_get_posts auf echten Seiten und statischen Titelseiten*)
Im Wesentlichen, WP_Query
wird von der Hauptabfrage verwendet und auch von verwendet von get_posts
, aber trotzdem get_posts()
Verwendet WP_Query
, Es gibt einige Unterschiede
get_posts
sind schneller alsWP_Query
. Die Marge hängt von der Menge der Gesamtstellen des Standorts ab. Der Grund dafür ist,get_posts
geht vorbei'no_found_rows' => true
StandardmäßigWP_Query
die übersprungen/legal bricht die Pagination. Mit'no_found_rows' => true
,WP_Query
Erholt die Anzahl der Beiträge, die befragt werden, und rettet dann, wenn es standardmäßig nach allen Beiträgen gesucht wird, die der Abfrage entsprechen, um die Paginierung zu berechnen.Deshalb,
get_posts()
sollte nur für nicht heftige Fragen verwendet werden. Paginierenget_posts
ist wirklich ein großes Durcheinander.WP_Query
sollte für alle paginierten Fragen verwendet werdenget_posts()
sind nicht von der beeinflusstposts_*
Filter woWP_Query
wird von diesen Filtern beeinflusst. Der Grund ist, dassget_posts
, standardmäßig vergeht'suppress_filters' => true
zuWP_Query
get_posts
hat ein paar zusätzliche Parameter wieinclude
,exclude
,numberposts
undcategory
. Diese Parameter werden in gültige Parameter für umgewandeltWP_Query
Bevor er übergeben wirdWP_Query
.include
wird in umgeändertpost__in
,exclude
hineinpost__not_in
,category
hineincat
undnumberposts
hineinposts_per_page
. Nur eine Notiz, alle der Parameter, die an übergeben werden könnenWP_Query
arbeitet mitget_posts
, Sie kann Ignorieren und nicht die Standardparameter von verwendenget_posts
get_posts
Gibt nur die zurück$posts
Eigentum vonWP_Query
währendWP_Query
Gibt das vollständige Objekt zurück. Dieses Objekt ist sehr nützlich, wenn es um Bedingungen, Paginierung und andere nützliche Informationen geht, die in der Schleife verwendet werden können.get_posts
Verwendet die Schleife nicht, aber aforeach
Schlaufe zum Anzeigen von Beiträgen. Außerdem sind standardmäßig keine Vorlagen -Tags verfügbar.setup_postdata( $post )
Muss verwendet werden, um die Vorlagen -Tags verfügbar zu machen.WP_Query
Verwendet die Schleifen- und Vorlagen -Tags standardmäßig sind die Tags zur Verfügungget_posts
geht vorbei'ignore_sticky_posts' => 1
zuWP_Query
, Alsoget_posts
Standardmäßig ignoriert klebrige Beiträge
Basierend auf dem oben genannten, ob Sie verwenden möchten get_posts
oder WP_Query
liegt bei Ihnen und was brauchen Sie tatsächlich aus der Abfrage. Das obige sollte Sie bei Ihrer Wahl führen
Der grundlegende Unterschied ist das query_posts()
ist wirklich nur zum Ändern der aktuellen Schleife. Sobald Sie fertig sind, ist es notwendig, die Schleife zurückzusetzen und auf die fröhliche Weise zu senden. Diese Methode ist auch etwas einfacher zu verstehen, einfach weil Ihre "Abfrage" im Grunde eine URL -Zeichenfolge ist, die Sie an die Funktion übergeben, wie Sie:
query_posts('meta_key=color&meta_value=blue');
Auf der anderen Seite, WP_Query
ist eher ein Allzweck -Tool und eher wie das direkte Schreiben von MySQL -Abfragen als direktes Schreiben query_posts()
ist. Sie können es auch überall verwenden (nicht nur in der Schleife), und es beeinträchtigt nicht die derzeit ausgeführten Postfragen.
Ich neige dazu zu verwenden WP_Query
öfter, wie es passiert. Wirklich, es wird auf Ihren speziellen Fall zurückzuführen.
Es ist einfach nicht nötig zu verwenden query_posts()
. Alles was es tut ist ein neues WP_Query -Objekt zu instanziieren und dieses neue Objekt zuzuordnen global wp_query
.
Als Referenz folgt das tatsächliche query_posts()
Funktion.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Instantieren Sie Ihr eigenes WP_Query -Objekt, wenn Sie ein detailliertes Skript für benutzerdefinierte Abfragen erstellen möchten. Oder verwenden get_posts()
Wenn Sie nur eine leichte Manipulation hier und da tun müssen.
In beiden Fällen empfehle ich Ihnen dringend, sich einen Gefallen zu tun und zu gehen wp_includes/query.php
und durchsuchen WP_Query
Klasse.
Stellen Sie sicher, dass Sie verwenden wp_reset_query()
nach der Verwendung query_posts()
Weil es auch andere Abfrageergebnisse beeinflusst.
Wenn ich mich erinnere, dass ich richtig gelesen habe, tut "die Schleife" im Wesentlichen WP_Query
in den Kerndateien, aber leichter zu verstehen.
- query_posts (): Kann in einem und nur in einem Fall verwendet werden, wenn Sie die Hauptabfrage ändern müssen. Es setzt viele globale Variablen;
- get_posts (): Es ist in der Mechanik sehr ähnlich und akzeptiert die gleichen Argumente, gibt jedoch eine Reihe von Beiträgen zurück
- Wp_query: Sie können mit eigenem Objekt davon erstellen und arbeiten. Ein bisschen komplexer, weniger Einschränkungen, es ist sicher, irgendwohin zu verwenden.
Ich würde sagen, benutze nicht get_posts()
im Plugin. Es führt in einigen Fällen sehr restriktive Filter (SET's suppress_filters
, ignore_sticky_posts
, usw.) und sollte wahrscheinlich nur in einem Thema verwendet werden, wenn Sie etwas schnell erledigen möchten.