query_posts()
Technisch gesehen gibt es zwei Funktionen. Einer query_posts()
ist tatsächlich WP_Query::query_posts()
und der andere ist im globalen Raum.
Fragen aus der Vernunft:
Wenn global query_posts()
ist das "böse", warum wird nicht veraltet?
Oder warum ist nicht markiert als _doing_it_wong
.
query-posts
prosti
quelle
quelle
Antworten:
Wesentliche Frage
Lassen Sie uns graben sich in das Trio:
::query_posts
,::get_posts
undclass WP_Query
zu verstehen ,::query_posts
besser.Der Grundstein für das Abrufen der Daten in WordPress ist die
WP_Query
Klasse. Beide Methoden::query_posts
und::get_posts
verwenden diese Klasse.Das verstehen
WP_Query
Hier ist die
WP_Query
Struktur:WP_Query
ist das Schweizer Taschenmesser.Einige Dinge über
WP_Query
:pre_get_posts
HakenIch kann das alles nicht erklären, aber einige davon sind schwierig, also geben wir kurze Tipps.
WP_Query
können Sie über Argumente steuern, die Sie übergebenDies wäre das minimale Beispiel, bei dem das
WP_Query
Objekt aus den Argumenten erstellt wird:WP_Query
ist gierigget all you can
Entwickelt auf der Idee, WordPress-Entwickler beschlossen, alle möglichen Daten frühzeitig zu erhalten, da dies gut für die Leistung ist . Wenn die Abfrage 10 Posts aus der Datenbank entnimmt, werden daher standardmäßig auch die Begriffe und die Metadaten für diese Posts über separate Abfragen abgerufen. Begriffe und Metadaten werden zwischengespeichert (Prefetch).Sie können die Caching deaktivieren , wenn Sie festgelegt
update_post_meta_cache
undupdate_post_term_cache
zu ,false
während die EinstellungWP_Query
Argumente. Wenn die Zwischenspeicherung deaktiviert ist, werden die Daten nur bei Bedarf aus der Datenbank angefordert.Bei den meisten WordPress-Blogs funktioniert das Zwischenspeichern gut, aber es kann vorkommen, dass Sie das Zwischenspeichern deaktivieren.
WP_Query
verwendet HilfsklassenWenn Sie dort
WP_Query
Felder markiert haben, haben Sie diese drei:Sie können sich vorstellen, in Zukunft neue hinzuzufügen.
WP_Query
Enthält die Substanz zum LoopingIn diesem Code:
Möglicherweise stellen Sie fest, dass
WP_Query
die Substanz, die Sie iterieren können, vorhanden ist. Die Hilfsmethoden gibt es auch. Sie stellen gerade diewhile
Schleife ein.WP_Query
primär und sekundärIn WordPress haben Sie eine primäre und keine oder mehrere sekundäre Abfragen.
Primäre Abfrage, die als Hauptabfrage oder reguläre Abfrage bezeichnet wird . Sekundäre Abfrage wird auch als benutzerdefinierte Abfrage bezeichnet .
WordPress verwendet
WP_Rewrite
Class Early, um die Abfrageargumente basierend auf der URL zu erstellen. Basierend auf diesen Argumenten speichert es die zwei identischen Objekte im globalen Raum. Beide enthalten die Hauptabfrage.Wenn wir main query sagen , denken wir an diese Variablen. Andere Abfragen können als sekundär oder benutzerdefiniert bezeichnet werden.
WP_Query
hat den praktischenpre_get_posts
Haken.Dies ist der Aktionshaken. Es gilt für jede
WP_Query
Instanz. Du nennst es so:Dieser Hook ist großartig und kann beliebige Abfrageargumente ändern.
Folgendes können Sie lesen :
Dieser Hook ist also Argument-Manager, kann jedoch keine neuen
WP_Query
Objekte erstellen . Wenn Sie eine primäre und eine sekundäre Abfrage hatten,pre_get_posts
können Sie die dritte nicht erstellen. Oder wenn Sie nur eine primäre hatten, kann sie die sekundäre nicht erstellen.WP_Query
unterstützt verschachtelte SchleifenHier ist das Vorzeigebeispiel, in dem WordPress auch für verschachtelte Schleifen Hilfsfunktionen bietet:
Die Ausgabe sieht folgendermaßen aus, da ich die Testdaten für die Themeneinheit installiert habe :
Obwohl ich 5 Posts in der benutzerdefinierten $ query angefordert habe, werden mir sechs zurückgegeben, da der klebrige Post mitgeht. Wenn es
wp_reset_postdata
im vorherigen Beispiel keine gibt, ist die Ausgabe wie folgt, da$GLOBALS['post']
sie ungültig ist.WP_Query
hatwp_reset_query
FunktionDies ist wie eine Reset-Taste.
$GLOBALS['wp_the_query']
sollte die ganze Zeit eingefroren sein und Plugins oder Themes sollten es niemals ändern.Hier ist was zu
wp_reset_query
tun:Bemerkungen zu
get_posts
get_posts
sieht aus wieEs ist nur ein Wrapper um ,
WP_Query
dass kehrt die Abfrageobjekt Beiträge.Der
ignore_sticky_posts
Wert true bedeutet, dass die klebrigen Pfosten möglicherweise nur in einer natürlichen Position angezeigt werden. Es gibt keine klebrigen Pfosten in der Front. Die andereno_found_rows
Einstellung auf true bedeutet, dass die WordPress-Datenbank-API keineSQL_CALC_FOUND_ROWS
Paginierung implementiert und die Datenbank weniger belastet, um die Anzahl der gefundenen Zeilen auszuführen .Dies ist praktisch, wenn Sie keine Paginierung benötigen. Wir verstehen jetzt, dass wir diese Funktion mit dieser Abfrage nachahmen können:
Hier ist die entsprechende SQL-Anfrage:
Vergleichen Sie das, was wir jetzt haben, mit der vorherigen SQL-Anforderung, sofern
SQL_CALC_FOUND_ROWS
vorhanden.Die Anfrage ohne
SQL_CALC_FOUND_ROWS
wird schneller sein.Bemerkungen zu
query_posts
query_posts()
istWP_Query
Wrapper. Es gibt die Referenz auf dasWP_Query
Hauptobjekt zurück und setzt gleichzeitig dieglobal $wp_query
.In PHP4 wurde alles, einschließlich der Objekte, als Wert übergeben.
query_posts
war wie folgt:Bitte beachten Sie, dass in einem typischen Szenario mit einer primären und einer sekundären Abfrage diese drei Variablen vorliegen:
Angenommen, jeder dieser drei Speicher benötigt 1 MB Speicher. Insgesamt wären 3M Speicher. Wenn wir verwenden
query_posts
,$GLOBALS['wp_query']
wird nicht gesetzt und neu erstellt.PHP5 + sollte intelligent sein, um das
$GLOBALS['wp_query']
Objekt zu leeren, genau wie in PHP4, in dem wir es gemacht habenunset($GLOBALS['wp_query']);
Infolgedessen werden
query_posts
insgesamt 2 MB Arbeitsspeicher undget_posts
3 MB Arbeitsspeicher verbraucht.Beachten Sie, dass
query_posts
wir nicht das eigentliche Objekt zurücksenden, sondern einen Verweis auf das Objekt.Hier ist ein Beispiel
Wird ergeben:
Versuchen Sie die Abfrage zurückzusetzen:
Wird ergeben:
Sie können Probleme erstellen, auch wenn Sie verwenden
WP_Query
Die Lösung wäre natürlich, die
wp_reset_query
Funktion wieder zu verwenden.Dies ist der Grund, warum ich denke,
query_posts
dass es vom Standpunkt des Gedächtnisses aus vielleicht besser ist. Aber du solltest immer einenwp_reset_query
Trick machen.quelle
Ich habe gerade ein neues Trac-Ticket, Ticket # 36874 , erstellt, um die Verfallserklärung von vorzuschlagen
query_posts()
. Ob es akzeptiert wird oder nicht, bleibt eine gute Frage.Das wirklich große Problem dabei
query_posts()
ist, dass es immer noch von Plugins und Themes verwendet wird, obwohl es wirklich gute Schriften zum Thema gibt, warum Sie es NIEMALS verwenden sollten. Ich denke, der epischste Beitrag hier auf WPSE ist der folgende:deprecation! == das Entfernen , so
query_posts()
dass die Verwendung durch Entwickler mit schlechter Qualität und Leute im Allgemeinen, die WordPress nicht kennen und Tutorials mit schlechter Qualität als Richtlinien verwenden, nicht aufhören wird, dies zu tun. So wie einige Beweise, wie viele Fragen bekommen wir immer noch hier , wo Menschen nutzencaller_get_posts
inWP_Query
? Es ist seit vielen Jahren veraltet.Veraltete Funktionen und Argumente können jedoch jederzeit entfernt werden, wenn die Kernentwickler dies für richtig halten. Dies wird jedoch höchstwahrscheinlich niemals der Fall sein,
query_posts()
da dies Millionen von Websites zum Erliegen bringt. Also ja, wir werden wahrscheinlich nie das vollständige Entfernen von sehenquery_posts()
- was dazu führen könnte, dass es höchstwahrscheinlich niemals veraltet wird.Dies ist zwar ein Ansatzpunkt, aber man muss bedenken, dass das Abwerten von WordPress-Inhalten die Verwendung nicht einschränkt.
UPDATE 19. Mai 2016
Das Ticket, das ich ausgelöst habe, ist jetzt geschlossen und als Duplikat eines 4 Jahre alten Tickets markiert , das als Wontfix geschlossen und wieder geöffnet wurde und weiterhin offen und ungelöst bleibt.
Die Kernentwickler scheinen an diesem alten treuen kleinen Übel festzuhalten. Alle Interessierten, hier ist das Duplikat des 4 Jahre alten Tickets
quelle
[etwas schimpfen]
Es ist an dieser Stelle die ständige Kernphilosophie, dass nichts wirklich veraltet ist. Auch wenn es eine nette Nachricht ist, wird sie einfach ignoriert, wenn die Funktion nicht tatsächlich irgendwann gelöscht wird. Es gibt viele Leute, die sich nicht mit entwickeln
WP_DEBUG
und die Meldung nicht bemerken, wenn es nicht zu einem tatsächlichen Bruch kommt.OTOH Hand, diese Funktion ist wie eine
goto
Aussage. Persönlich habe ich nie (für eine kleinere Definition als erwartet) verwendet,goto
aber ich kann die Argumente verstehen, die auf eine Situation hinweisen, in der es standardmäßig nicht böse ist. Ebensoquery_posts
ist es eine einfache Möglichkeit, alle für eine einfache Schleife erforderlichen Globals einzurichten, und kann im Ajax- oder Rest-Api-Kontext nützlich sein. Ich würde es niemals auch in solchen Kontexten verwenden, aber ich kann sehen, dass es sich eher um eine Frage des Codierungsstils als um eine Funktion handelt, die von sich aus böse ist.Das Hauptproblem besteht darin, dass überhaupt Globals festgelegt werden müssen. Das ist das Hauptproblem, nicht die einzige Funktion, die beim Einstellen hilft.
quelle
query_posts
langsamer als eine sekundäre Abfrage (sprich: nicht die Hauptabfrage).query_posts
selbst, sondern die nutzlose Abfrage, die beim Laden von WP ausgeführt wurde