Es scheint wie die Hälfte der Tutorials im Codex und um die Blogosphäre zu nutzen query_posts()
und die Hälfte zu nutzen WP_Query
. Was ist das Problem?
wp-query
query-posts
query
get-posts
Dan Gayle
quelle
quelle
Antworten:
query_posts()
ist zu simpel und eine problematische Möglichkeit, die Hauptabfrage einer Seite zu ändern, indem sie durch eine neue Instanz der Abfrage ersetzt wird. Es ist ineffizient (führt SQL-Abfragen erneut aus) und schlägt unter bestimmten Umständen (besonders häufig bei Seitenumbrüchen) fehl. Jeder moderne WP-Code solltepre_get_posts
zu diesem Zweck zuverlässigere Methoden verwenden, beispielsweise den Hook. TL; DR verwenden niemals query_posts () .get_posts()
ist in der Verwendung sehr ähnlich und akzeptiert dieselben Argumente (mit einigen Nuancen, wie z. B. unterschiedliche Standardeinstellungen), gibt jedoch eine Reihe von Posts zurück, ändert keine globalen Variablen und kann überall sicher verwendet werden.WP_Query
ist die Klasse, die beide hinter den Kulissen unterstützt. Sie können jedoch auch eine eigene Instanz davon erstellen und damit arbeiten. Etwas komplexer, weniger Einschränkungen, auch überall sicher einsetzbar.quelle
query_posts()
ist eine winzige Wrapper-Funktion fürWP_Query
, die einzige zusätzliche Funktion (gemäß Flussdiagramm) ist das Überschreiben globaler$wp_query
query_posts()
durchWP_Query
wird die Leistung nicht beeinträchtigt. Die Abfrage der Originalseite wird weiterhin ausgeführt, da dies Teil der Kernlast ist. Diese Abfragen werden auch dann ausgeführt, wenn Ihre Vorlagendatei überhaupt keine Schleife aufweist.query_posts
nicht ändert die Hauptschleife überhaupt, es ersetzt es nach ihm bereits ausgeführt wird. Die Hauptschleife lässt sich am besten über einenpre_get_posts
Filter ändern . developer.wordpress.com/2012/05/14/…query_posts
- Sie sollten niemals verwendenquery_posts
. Abgesehen von dem, was @Rarst gesagt hat, ist das wirklich große Problemquery_posts
, dass das Hauptabfrageobjekt (gespeichert in$wp_query
) beschädigt wird . Viele Plugins und benutzerdefinierter Code basieren auf dem Hauptabfrageobjekt. Wenn Sie also das Hauptabfrageobjekt beschädigen, werden die Funktionen von Plugins und benutzerdefiniertem Code beeinträchtigt. Eine dieser Funktionen ist die wichtigste Paginierungsfunktion. Wenn Sie also die Hauptabfrage unterbrechen, unterbrechen Sie die Paginierung.Um zu beweisen, wie schlecht
query_posts
eine Vorlage ist, gehen Sie wie folgt vor und vergleichen Sie die Ergebnisseget_posts
undWP_Query
sind der richtige Weg, um sekundäre Abfragen ( wie verwandte Beiträge, Slider, empfohlene Inhalteund Inhalte auf statischen Titelseiten) mit zu konstruieren . Es sollte beachtet werden, dass Sie keine der beiden für die Hauptabfrage auf der Startseite, der einzelnen Seite oder einer Archivseite verwenden sollten, da dies die Seitenfunktionalität beeinträchtigt. Wenn Sie die Hauptabfrage ändern müssen, verwenden Siepre_get_posts
dazu und keine benutzerdefinierte Abfrage. ( UPDATE: Informationen zu statischen Titelseiten und echten Seiten finden Sie unter Verwenden von pre_get_posts für echte Seiten und statische Titelseiten *)Im Wesentlichen
WP_Query
wird durch die Haupt-Abfrage verwendet und auch verwendet wirdget_posts
, aber obwohlget_posts()
AnwendungenWP_Query
, gibt es ein paar Unterschiedeget_posts
sind schneller alsWP_Query
. Die Marge hängt von der Anzahl der Beiträge auf der Website ab. Der Grund hierfür ist,get_posts
geht'no_found_rows' => true
standardmäßig ,WP_Query
die überspringt / rechtlich Paginierung bricht. Mit'no_found_rows' => true
,WP_Query
wird die Anzahl der abgefragten Posts abgerufen und dann gelöscht, wobei standardmäßig nach allen Posts gesucht wird, die mit der Abfrage übereinstimmen, um die Paginierung zu berechnen.Aus diesem Grund
get_posts()
sollte nur für nicht paginierte Abfragen verwendet werden. Paginierenget_posts
ist wirklich ein großes Durcheinander.WP_Query
sollte für alle paginierten Abfragen verwendet werdenget_posts()
werden nicht von denposts_*
FilternWP_Query
beeinflusst, auf die sich diese Filter auswirken. Der Grund dafür ist, dassget_posts
standardmäßig'suppress_filters' => true
an übergeben wirdWP_Query
get_posts
hat ein paar zusätzliche Parameter wieinclude
,exclude
,numberposts
undcategory
. Diese Parameter werden in gültige Parameter für geändert,WP_Query
bevor sie an übergeben werdenWP_Query
.include
wird verwandelt inpost__in
,exclude
inpost__not_in
,category
incat
undnumberposts
inposts_per_page
. Nur eine Anmerkung, alle Parameter, die übergeben werden können,WP_Query
funktionierenget_posts
, Sie können die Standardparameter von ignorieren und nicht verwendenget_posts
get_posts
Gibt nur die$posts
Eigenschaft vonWP_Query
whileWP_Query
zurück, während das gesamte Objekt zurückgegeben wird. Dieses Objekt ist sehr nützlich, wenn es um Bedingungen, Paginierung und andere nützliche Informationen geht, die innerhalb der Schleife verwendet werden können.get_posts
verwendet nicht die Schleife, sondern eineforeach
Schleife zum Anzeigen von Beiträgen. Standardmäßig sind auch keine Vorlagen-Tags verfügbar.setup_postdata( $post )
muss verwendet werden, um die Template-Tags zur Verfügung zu stellen.WP_Query
verwendet die Schleife und Template-Tags sind standardmäßig verfügbarget_posts
übergibt'ignore_sticky_posts' => 1
anWP_Query
,get_posts
ignoriert also standardmäßig klebrige BeiträgeBasierend auf den oben genannten, ob zu verwenden
get_posts
oderWP_Query
ist an Ihnen , und was brauchen Sie eigentlich aus der Abfrage. Das Obige sollte Sie bei Ihrer Wahl leitenquelle
Der grundlegende Unterschied besteht darin, dass dies
query_posts()
nur zum Ändern der aktuellen Schleife dient. Sobald Sie fertig sind, müssen Sie die Schleife zurücksetzen und auf die fröhliche Weise senden. Diese Methode ist auch ein wenig einfacher zu verstehen, da Ihre "Abfrage" im Grunde eine URL-Zeichenfolge ist, die Sie an die Funktion übergeben, wie folgt:Auf der anderen Seite
WP_Query
handelt es sich eher um ein Allzweck-Tool und ähnelt eher dem direkten Schreiben von MySQL-Abfragenquery_posts()
. Sie können es auch überall verwenden (nicht nur in der Schleife) und es stört keine derzeit ausgeführten Post-Abfragen.Ich neige dazu,
WP_Query
öfter zu verwenden, als es passiert. Wirklich, es wird auf Ihren speziellen Fall ankommen.quelle
Es besteht einfach keine Notwendigkeit zu verwenden
query_posts()
. Es instanziiert lediglich ein neues WP_Query-Objekt und weist dieses neue Objekt neu zuglobal wp_query
.Als Referenz ist das Folgende die tatsächliche
query_posts()
Funktion.Instanziieren Sie Ihr eigenes WP_Query-Objekt, wenn Sie ein detailliertes benutzerdefiniertes Abfrageskript erstellen möchten. Oder verwenden Sie,
get_posts()
wenn Sie nur hier und da etwas Licht manipulieren müssen.In beiden Fällen kann ich nur empfehlen, sich selbst einen Gefallen zu
wp_includes/query.php
tun und dieWP_Query
Klasse zu besuchen und zu lesen .quelle
Stellen Sie sicher, dass Sie
wp_reset_query()
nach der Verwendung verwenden,query_posts()
da dies auch andere Abfrageergebnisse beeinflusst.quelle
Wenn ich mich erinnere, dass ich richtig gelesen habe, geschieht dies
WP_Query
im Wesentlichen in der Schleife in den Kerndateien, jedoch auf eine leichter verständliche Weise.quelle
quelle
Ich würde sagen, nicht
get_posts()
in einem Plugin verwenden. Es stellt sehr restriktive Filter in einigen Fällen (Setsuppress_filters
,ignore_sticky_posts
etc.) und soll wohl nur in einem Thema verwendet werden , wenn Sie etwas getan schnell wollen.quelle