wake-up-neo.com

Wann sollten Sie WP_Query vs query_posts () vs get_posts () verwenden?

Es scheint, als ob die Hälfte der Tutorials im Codex und in der Blogosphäre query_posts() und die Hälfte WP_Query verwenden. Was ist das Problem?

412
Dan Gayle
  • query_posts() ist zu simpel und ein problematischer Weg, 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 zu diesem Zweck zuverlässigere Methoden verwenden, beispielsweise den pre_get_posts hook. TL; DR benutze niemals query_posts () .

  • get_posts() ist in der Verwendung sehr ähnlich und akzeptiert dieselben Argumente (mit einigen Nuancen, wie z. B. unterschiedlichen Standardwerten), 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, aber Sie können auch eine eigene Instanz davon erstellen und damit arbeiten. Etwas komplexer, weniger Einschränkungen, auch überall sicher einsetzbar.

  

658
Rarst

query_posts - Verwenden Sie niemals query_posts. Abgesehen von dem, was @Rarst gesagt hat, ist das wirklich große Problem bei query_posts, dass das Hauptabfrageobjekt (in $wp_query gespeichert) 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 auf einer 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 secondary abfragen (wie verwandte Beiträge, Slider, vorgestellte Inhalte) zu erstellen und Inhalt auf statischen Titelseiten) mit. Es ist zu beachten, dass Sie keine der beiden Optionen für die Hauptabfrage auf der Homepage, der einzelnen Seite oder einer Archivseite verwenden sollten, da dies die Seitenfunktionalität beeinträchtigt. Wenn Sie die Hauptabfrage ändern müssen, verwenden Sie dazu pre_get_posts und keine benutzerdefinierte Abfrage. (UPDATE:Statische Titelseiten und echte Seiten finden Sie unter Verwenden von pre_get_posts für echte Seiten und statische Titelseiten *)

Im Wesentlichen wird WP_Query von der Hauptabfrage und auch von get_posts verwendet. Obwohl get_posts()WP_Query verwendet, gibt es einige Unterschiede

  • get_posts sind schneller als WP_Query. Die Marge hängt von der Anzahl der Beiträge auf der Website ab. Der Grund dafür ist, dass get_posts'no_found_rows' => true standardmäßig an WP_Query weitergibt, wodurch die Paginierung übersprungen/legal unterbrochen wird. Mit 'no_found_rows' => true ruft WP_Query die Anzahl der abgefragten Posts ab und landet dann in der Warteschlange. In der Standardeinstellung wird nach allen Posts gesucht, die mit der Abfrage übereinstimmen, um die Paginierung zu berechnen.

    Aus diesem Grund sollte get_posts() nur für nicht paginierte Abfragen verwendet werden. Das Paginieren von get_posts ist wirklich ein großes Durcheinander. WP_Query sollte für alle paginierten Abfragen verwendet werden

  • get_posts() wird von den posts_* -Filtern nicht beeinflusst, wohingegen WP_Query von diesen Filtern beeinflusst wird. Der Grund dafür ist, dass get_posts standardmäßig 'suppress_filters' => true an WP_Query übergibt.

  • get_posts hat einige zusätzliche Parameter wie include, exclude, numberposts und category. Diese Parameter werden in gültige Parameter für WP_Query geändert, bevor sie an WP_Query übergeben werden. include wird in post__in, exclude in post__not_in, category in cat und numberposts in posts_per_page geändert. Nur eine Notiz, alle der Parameter, die an WP_Query übergeben werden können, funktioniert mit get_posts, Sie können die Standardparameter von get_posts ignorieren und nicht verwenden

  • get_posts gibt nur die Eigenschaft $posts von WP_Query zurück, während WP_Query das gesamte Objekt zurückgibt. 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, um Beiträge anzuzeigen. Standardmäßig sind auch keine Vorlagen-Tags verfügbar. setup_postdata( $post ) muss verwendet werden, um die Template-Tags verfügbar zu machen. WP_Query verwendet die Schleife und Template-Tags sind standardmäßig verfügbar

  • get_posts übergibt 'ignore_sticky_posts' => 1 an WP_Query, daher ignoriert get_posts standardmäßig klebrige Beiträge

Auf der Grundlage des oben Gesagten liegt es bei Ihnen, ob Sie get_posts oder WP_Query verwenden und was Sie tatsächlich von der Abfrage benötigen. Das Obige sollte Sie bei Ihrer Wahl leiten

60
Pieter Goosen

Der grundlegende Unterschied besteht darin, dass query_posts() eigentlich 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 etwas 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 ist WP_Query eher ein Allzweck-Tool und ähnelt eher dem direkten Schreiben von MySQL-Abfragen als 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 benutze WP_Query eher öfter, als es passiert. Wirklich, es wird auf Ihren speziellen Fall ankommen.

31
nickmjones

Es ist einfach nicht erforderlich, query_posts() zu verwenden. Es instanziiert lediglich ein neues WP_Query-Objekt und weist dieses neue Objekt global wp_query zu.

Als Referenz ist das Folgende die tatsächliche Funktion query_posts().

 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 hier und da nur eine leichte Manipulation vornehmen müssen.

In beiden Fällen empfehle ich Ihnen dringend, sich selbst einen Gefallen zu tun, wp_includes/query.php zu besuchen und die WP_Query-Klasse durchzulesen.

15
RebelPhoenix

Stellen Sie sicher, dass Sie wp_reset_query() nach query_posts() verwenden, da dies auch andere Abfrageergebnisse beeinflusst.

14

Wenn ich mich recht erinnere, macht "die Schleife" WP_Query in den Kerndateien, aber auf eine leichter verständliche Weise.

10
tw2113
  • query_posts () : wird möglicherweise nur in Einzelfällen verwendet, wenn Sie die Hauptabfrage ändern müssen. Es werden viele globale Variablen gesetzt.
  • get_posts () : Es ist in der Mechanik sehr ähnlich und akzeptiert dieselben Argumente, gibt aber ein Array von Posts zurück
  • WP_Query : Sie können ein eigenes Objekt erstellen und damit arbeiten. Etwas komplexer, weniger Einschränkungen, überall sicher einsetzbar.
6
dalveer