Wie erhalte ich ein Array von Post-Daten aus dem Ergebnis von wp_query?


35

Beim Ausführen einer Abfrage mit der WP_Query-Methode habe ich ein Objekt erhalten. Ich verstehe, dass ich dann die Schleife machen kann, um Sachen anzuzeigen. Mein Ziel ist es jedoch, nichts anzuzeigen. Stattdessen möchte ich einige Post-Daten abrufen, indem ich so etwas wie "foreach ..." mache. Wie kann ich eine Reihe von Post-Daten abrufen, die ich durchlaufen und abrufen kann?


2
Ein wichtiger Unterschied zwischen dem direkten Zugriff auf Post-Daten und der Verwendung von Template-Tags besteht darin, dass auf die Daten keine Filter angewendet werden und einige Funktionen möglicherweise nicht mehr funktionieren.
Milo

Antworten:


73

Sie sollten die Funktionsreferenz für WP_Query im WordPress-Codex lesen . Dort gibt es viele Beispiele zu sehen. Wenn Sie die Ergebnismenge nicht mit a durchlaufen möchten while, können Sie alle von der Abfrage zurückgegebenen Posts mit dem WP_Queryin der Eigenschaft abrufen posts.

Beispielsweise

$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;

foreach($posts as $post) {
    // Do your stuff, e.g.
    // echo $post->post_name;
}

1
In keinem der von Ihnen verlinkten Beispiele wird jedoch gezeigt, wie Beiträge verarbeitet werden. Es ist also gut, dass Sie geantwortet haben, schade, dass sie es nicht in der Dokumentation haben. Ein weiterer Tipp: Wenn Sie ein Match für einen eindeutigen Post durchführen, können Sie eine Funktion wie diese mit 'posts_per_page'=>1in args verwenden. function wp_queryfirstpost($args) { $q=new WP_Query($args); $pp=$q->get_posts(); $firstpost=false;if ($pp) $firstpost=$pp[0]; wp_reset_postdata(); return $firstpost; }
Henrik Erlandsson

@ rofflox: Du bist ein Heiliger! Ideal, um get_the_title / ID / younameit zu umgehen.
Vial

8
Sie sollten $query->postsstattdessen verwenden, $query->get_posts()um eine erneute Ausführung der Analyse und zusätzliche unnötige Datenbankabfragen auszulösen
Tom J Nowell

$ query-> get_posts (); funktioniert nicht wie erwartet. Ich weiß nicht warum, aber es gibt weniger Beiträge als die Abfrage zurück. Siehe hier: stackoverflow.com/questions/25395299/…
Laxmana

1
Diese Antwort ist einfach falsch, wenn Sie eine neue WP_Query mit einigen Argumenten erstellen, wird die Methode get_posts () sofort intern aufgerufen und Sie sollten sie nicht noch einmal aufrufen! Wenn Sie es erneut aufrufen, wie im obigen Beispiel gezeigt, wird eine UNTERSCHIEDLICHE Abfrage ausgeführt, die von den Argumenten und Ergebnissen abhängt, die bei der ersten Ausführung (interne Flags usw.) angegeben wurden, und möglicherweise eine andere (kleinere) Ergebnismenge zurückgibt oder überhaupt keine Ergebnisse. Wie oben von TomJNowell und Laxmana vorgeschlagen, sollte man $ query-> posts verwenden, um die Post-Daten abzurufen.
ivanhoe

11

Eigentlich müssen Sie sich nicht weigern, while()loop zu verwenden . Dasselbe WP_Post-Objekt ist bereits in der postEigenschaft gespeichert :

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();

                // now $query->post is WP_Post Object, use:
                // $query->post->ID, $query->post->post_title, etc.

            }

        }

2
ifist überflüssig.
Akkumulator

2
Nein, ifist nicht redundant. Genau in diesem Fall müssen Sie jedoch in den meisten Produktionssituationen zwischen if und while Code ausführen.
magi182

2
@ magi182 Das macht es in genau diesem Fall überflüssig. Die Leute sollten lernen, wann man das benutzt.
Frodeborli

4
@frodeborli, Das Schöne an Aussagen, die mit "people should" beginnen, ist, dass man fast immer "people don't" ersetzen kann und die Aussage immer noch als wahr testet.
magi182

1
@magi182 Ich könnte wahrscheinlich hundert schöne Codezeilen machen, um den obigen Code zu ergänzen.
Frodeborli

-1

Sie können auch get_posts( $args )anstelle von verwenden wp_Query(), wodurch Sie eine Liste der Beiträge erhalten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.