Gibt es Szenarien, in denen die Query_posts verwendet werden können?

Ich habe den Eindruck, dass unter ” query_posts() ” ein roter Knopf mit der Aufschrift “Do not press” query_posts() . Seit einiger Zeit versuche ich, dieses Phänomen mit sehr geringem Erfolg zu entmystifizieren, um ehrlich zu sein.

Zum Beispiel ist wahrscheinlich der Hauptgrund, diese function nicht zu verwenden, eine unterbrochene Seitennummerierung. Zweitens, war es möglicherweise langsam (lesen: zweimal aufrufen), oder es gibt bessere Möglichkeiten ( pre_get_posts ). Es kann mehr Gründe geben.

Für diejenigen, die diese Frage instinktiv abtun könnten, würde ich appellieren, wenigstens für eine Woche oder so zu halten. Es gibt immer eine zweite Chance, das zu tun. Ich warte kaum darauf, wenigstens einige Antworten zu sehen, bevor ein Teamdruck entsteht.

Für diejenigen, die diesen Beitrag nicht lesen, würde ich sagen, dass diese function weder veraltet ist noch als _doing_it_wrong markiert _doing_it_wrong , noch gibt es Pläne. Sogar das Ticket, um es veraltet zu machen, wurde kürzlich geschlossen.

Manche mögen sagen, dass sie diese function lesen, sie dürfen nicht innerhalb des WordPress verwendet werden. Ich biete hier die volle function an.

 File: /wp-includes/query.php 79: /** 80: * Set up The Loop with query parameters. 81: * 82: * This will override the current WordPress Loop and shouldn't be used more than 83: * once. This must not be used within the WordPress Loop. 84: * 85: * @since 1.5.0 86: * 87: * @global WP_Query $wp_query Global WP_Query instance. 88: * 89: * @param string $query 90: * @return array List of posts 91: */ 92: function query_posts($query) { 93: $GLOBALS['wp_query'] = new WP_Query(); 94: return $GLOBALS['wp_query']->query($query); 95: } 

Sie können sehen, dass This must not be used within the WordPress Loop. , also nicht innerhalb der WordPress-Schleife, was bedeutet, dass die WordPress-Schleife möglicherweise nicht verboten ist.

Ich habe aus diesem Beitrag bemerkt, dass diese function nicht langsamer ist als jede sekundäre Abfrage (mit denselben Argumenten).

Bottomline, die Paginierung query_posts ist viel bessere Lösung für die Paginierung als die get_posts da get_posts tatsächlich SQL_CALC_FOUND_ROWS deaktiviert.

Einige gute Gedanken zu den query_posts können sein:

  • Die Abfrageargumente sind nicht begrenzt, Sie können alles festlegen, was Sie möchten.
  • Sie können sogar die Argumente für die Verwendung der Paginierung festlegen, wenn Sie nicht beabsichtigen, Seitenumbruchfunktionen zu verwenden. Super einfach können Sie Ihre eigene Paginierung erstellen
  • In einem typischen Blog kann nur ein kleiner Teil der Seiten Paginierung verwenden. Die meisten Seiten, in den meisten einfachen Fällen, verwenden nicht einmal die Seitennummerierung, um schnell etwas zu tun und die Hauptabfrage-Templates ( query_posts ) query_posts zu verwenden.

Dies sind nur einige der wenigen Gedanken, ich bin mir sicher, dass es mehr gibt, aber sicherlich Wenn du weißt, was du schaffst, kannst du nicht falsch liegen.


Nein

Solutions Collecting From Web of "Gibt es Szenarien, in denen die Query_posts verwendet werden können?"

query_posts() ist in Fällen nützlich, in denen es keine Hauptabfrage gibt : Aufrufe an wp-admin/admin-ajax.php , wp-admin/admin-post.php oder wp-login.php zum Beispiel.

Ja, Sie können die gleichen Ergebnisse dort ohne query_posts() und etwas weniger kompakten Code erreichen. Aber wenn Sie sich nicht um Nebenwirkungen kümmern müssen, ist die Verwendung von query_posts() akzeptabel.

Wann immer die Hauptabfrage verfügbar ist, die für jedes Laden der Frontendseite gilt, unabhängig davon, welche Seite / Archiv geladen ist, sollten Sie pre_get_posts , um die Abfrageabfragen der pre_get_posts zu ändern, bevor die SQL-Abfrage erstellt und ausgeführt wird. Dies gilt für jede einzelne Seite, auf der Sie die Hauptabfrage ändern müssen. Dies ist die EMPFOHLENE Möglichkeit, die Hauptabfrage zu ändern. Auf diese Weise werden keine zusätzlichen databaseabfragen durchgeführt, Punkt. Für echte Seiten und statische Titelseiten können Sie immer meine PreGetPostsForPages class oder sogar die hier von pre_get_posts beschriebene Methode pre_get_posts verwenden .

Sie sollten niemals die Hauptabfrage durch eine benutzerdefinierte Abfrage ersetzen, indem Sie query_posts , eine neue Instanz von WP_Query oder get_posts . Dies fügt zusätzliche Db-Aufrufe pro Seitenladevorgang hinzu, da die Hauptabfrage unabhängig ausgeführt wird. Wenn Sie die Hauptabfrage durch eine benutzerdefinierte Abfrage ersetzen, führen Sie doppelt so viele db-Aufrufe aus, was auch die Ladezeiten von Seiten erhöht. Nicht nur das, Paginierung wird zum Albtraum. Sie sollten sich Zeit nehmen und diese Antwort lesen , die ich bei der Seitennummerierung gemacht habe .

Sie sollten nur benutzerdefinierte Abfragen für Dinge wie Schieberegler, Widgets, verwandte Beiträge und Navigationsmenüs ausführen, niemals die Hauptabfrage ersetzen oder ändern.

query_posts bleibt query_posts noch ein sehr problematischer Weg, um benutzerdefinierte Abfragen auszuführen, da es das in $wp_query ( $ GLOBALS [‘wp_query’] ) gespeicherte $wp_query verändert, weil so viele functionen und Plugins auf das Hauptabfrageobjekt angewiesen sind, um Dinge wie Pagination und verwandte Dinge auszuführen Beiträge und Brotkrumen

Als @toscho bereits erwähnt, verwenden Sie nur query_posts wenn es keine Hauptabfrage gibt, die für Ajax-Aufrufe und einige Seiten auf der Admin-Seite ist. Abgesehen davon sollten Sie wirklich vermeiden, es zu verwenden, akzeptiert, wenn Sie wirklich etwas am Front-End brechen müssen.

Wie gesagt, es ist überhaupt nicht notwendig, irgendeine Art von benutzerdefinierter Abfrage anstelle der Hauptabfrage auszuführen, nur um die Ausgabe von der Seite zu ändern oder zu modifizieren. Wenn Sie wirklich eine bessere performance und schnellere Ladezeiten benötigen, verwenden Sie pre_get_posts , um die pre_get_posts zu ändern und sie niemals aus irgendeinem Grund zu ersetzen. Benutzerdefinierte Abfragen sollen zusätzliche Dinge wie Widgets, verwandte Beiträge und Schieberegler erledigen

BEARBEITEN

Als letzte Anmerkung und als Beweis laden Sie das Query Monitor Plugin herunter und installieren es. Auf diese Weise können Sie den drastischen Anstieg der Seitenladezeit und der databaseaufrufe sehen, wenn Sie die Hauptabfrage durch eine benutzerdefinierte Abfrage ersetzen und wie es keinen Unterschied gibt, wenn Sie pre_get_posts

Entgegen der allgemeinen Meinung ist query_posts harmlos, wenn Sie wissen, wie man es benutzt. Ich habe hier versucht, mehr Argumente zu liefern.

Hier werde ich eine einfache Gliederung hinzufügen, auf die Sie sich nie verlassen sollten: $GLOBALS['wp_query'] .

Sie sollten sich auf $GLOBALS['wp_the_query'] , das eingefroren werden sollte. Wenn Sie die $GLOBALS['wp_query'] zurücksetzen $GLOBALS['wp_query'] einfach wp_reset_query .

Anwendungsfall

Bildbeschreibung hier eingeben

Wenn Sie dies beispielsweise auf einer Homepage nach der Hauptschleife benötigen, können Sie query_posts für die cpt1 und spätere query_posts erneut für die cpt2 aufrufen.