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?
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?
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 sollte pre_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.
query_posts()
ist eine winzige Wrapper-Funktion für WP_Query
, die einzige zusätzliche Funktion (gemäß Flussdiagramm) ist das Überschreiben globaler $wp_query
query_posts()
durch WP_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 einen pre_get_posts
Filter ändern . developer.wordpress.com/2012/05/14/…
query_posts
- Sie sollten niemals verwenden query_posts
. Abgesehen von dem, was @Rarst gesagt hat, ist das wirklich große Problem query_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 Ergebnisse
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
und WP_Query
sind der richtige Weg, um sekundäre Abfragen ( wie verwandte Beiträge, Slider, empfohlene Inhalte und 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 Sie pre_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 wird get_posts
, aber obwohl get_posts()
Anwendungen WP_Query
, gibt es ein paar Unterschiede
get_posts
sind schneller als WP_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. Paginieren get_posts
ist wirklich ein großes Durcheinander. WP_Query
sollte für alle paginierten Abfragen verwendet werden
get_posts()
werden nicht von den posts_*
Filtern WP_Query
beeinflusst, auf die sich diese Filter auswirken. Der Grund dafür ist, dass get_posts
standardmäßig 'suppress_filters' => true
an übergeben wirdWP_Query
get_posts
hat ein paar zusätzliche Parameter wie include
, exclude
, numberposts
und category
. Diese Parameter werden in gültige Parameter für geändert, WP_Query
bevor sie an übergeben werden WP_Query
. include
wird verwandelt in post__in
, exclude
in post__not_in
, category
in cat
und numberposts
in posts_per_page
. Nur eine Anmerkung, alle Parameter, die übergeben werden können, WP_Query
funktionieren get_posts
, Sie können die Standardparameter von ignorieren und nicht verwendenget_posts
get_posts
Gibt nur die $posts
Eigenschaft von WP_Query
while WP_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 eine foreach
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ügbar
get_posts
übergibt 'ignore_sticky_posts' => 1
an WP_Query
, get_posts
ignoriert also standardmäßig klebrige Beiträge
Basierend auf den oben genannten, ob zu verwenden get_posts
oder WP_Query
ist an Ihnen , und was brauchen Sie eigentlich aus der Abfrage. Das Obige sollte Sie bei Ihrer Wahl leiten
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:
query_posts('meta_key=color&meta_value=blue');
Auf der anderen Seite WP_Query
handelt es sich eher um ein Allzweck-Tool und ähnelt eher dem direkten Schreiben von MySQL-Abfragen query_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.
Es besteht einfach keine Notwendigkeit zu verwenden query_posts()
. Es instanziiert lediglich ein neues WP_Query-Objekt und weist dieses neue Objekt neu zu global wp_query
.
Als Referenz ist das Folgende die tatsächliche query_posts()
Funktion.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
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 die WP_Query
Klasse zu besuchen und zu lesen .
Stellen Sie sicher, dass Sie wp_reset_query()
nach der Verwendung verwenden, query_posts()
da dies auch andere Abfrageergebnisse beeinflusst.