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?

War es hilfreich?

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 des pre_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 als WP_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äßig WP_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. Paginieren get_posts ist wirklich ein großes Durcheinander. WP_Query sollte für alle paginierten Fragen verwendet werden

  • get_posts() sind nicht von der beeinflusst posts_* Filter wo WP_Query wird von diesen Filtern beeinflusst. Der Grund ist, dass get_posts, standardmäßig vergeht 'suppress_filters' => true zu WP_Query

  • get_posts hat ein paar zusätzliche Parameter wie include, exclude, numberposts und category. Diese Parameter werden in gültige Parameter für umgewandelt WP_Query Bevor er übergeben wird WP_Query. include wird in umgeändert post__in, exclude hinein post__not_in, category hinein cat und numberposts hinein posts_per_page. Nur eine Notiz, alle der Parameter, die an übergeben werden können WP_Query arbeitet mit get_posts, Sie kann Ignorieren und nicht die Standardparameter von verwenden get_posts

  • get_posts Gibt nur die zurück $posts Eigentum von WP_Query während WP_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 a foreach 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ügung

  • get_posts geht vorbei 'ignore_sticky_posts' => 1 zu WP_Query, Also get_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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top