Jak uzyskać tablicę danych postów z wyniku wp_query?

35

Po uruchomieniu zapytania metodą WP_Query dostałem obiekt. Rozumiem, że mogę zrobić pętlę, aby wyświetlić rzeczy. Ale moim celem nie jest wyświetlanie niczego, zamiast tego chcę uzyskać dane posta, wykonując coś w stylu „foreach ...”. Jak mogę uzyskać tablicę danych postów, które mogę przeglądać i pobierać?

Przędzarka
źródło
2
Ważną różnicą, o której należy pamiętać między bezpośrednim dostępem do danych postu a użyciem tagów szablonów, jest to, że filtry nie są stosowane do danych, a niektóre funkcje mogą się zepsuć.
Milo,

Odpowiedzi:

73

Powinieneś przeczytać odwołanie do funkcji WP_Query w kodeksie WordPress. Masz wiele przykładów do obejrzenia. Jeśli nie chcesz zapętlać zestawu wyników za pomocą a while, możesz uzyskać wszystkie posty zwrócone przez zapytanie z właściwością WP_Querywe posts.

Na przykład

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

foreach($posts as $post) {
    // Do your stuff, e.g.
    // echo $post->post_name;
}
rofflox
źródło
1
Jednak żaden z przykładów, do których linkujesz, nie pokazuje, jak przetwarzać posty. Dobrze, że odpowiedziałeś, szkoda, że ​​nie ma tego w dokumentacji. Kolejna wskazówka: jeśli dopasowujesz unikalny post, możesz użyć takiej funkcji 'posts_per_page'=>1w args. 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: Jesteś świętym! Idealne do obejścia get_the_title / ID / younameit.
Fiolka
8
Powinieneś użyć $query->postszamiast tego, $query->get_posts()spowoduje to ponowne uruchomienie analizy zapytań i dodatkowe niepotrzebne zapytania do bazy danych
Tom J Nowell
$ query-> get_posts (); nie działa zgodnie z oczekiwaniami. Nie jestem pewien, dlaczego, ale zwraca mniej postów niż zapytanie. Zobacz tutaj: stackoverflow.com/questions/25395299/…
Laxmana,
1
Ta odpowiedź jest po prostu błędna, kiedy tworzysz nową WP_Query z kilkoma argumentami, metoda get_posts () jest natychmiast wywoływana wewnętrznie i NIE POWINIENEŚ JUZYWAĆ! Jeśli wywołasz go ponownie, jak pokazano w powyższym przykładzie, uruchomi się RÓŻNE zapytanie, w zależności od argumentów i wyników z pierwszego uruchomienia (zestaw flag wewnętrznych itp.), I może potencjalnie zwrócić inny (mniejszy) zestaw wyników lub w ogóle nie ma wyników. Jak zasugerowali TomJNowell i Laxmana, należy użyć $ query-> postów, aby uzyskać dane postu.
ivanhoe,
11

W rzeczywistości nie musisz odmawiać używania while()pętli. Ten sam obiekt WP_Post jest już zapisany we postwłaściwości:

        $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.

            }

        }
Vladkras
źródło
2
ifjest zbędny.
Akkumulator
2
Nie, ifnie jest zbędny. W tym konkretnym przypadku tak jest, ale w większości sytuacji produkcyjnych masz kod do wykonania między if i a.
magi182
2
@ magi182 Co czyni go zbędnym w tym właśnie przypadku. Ludzie powinni nauczyć się, kiedy tego używać.
frodeborli
4
@frodeborli, miłą rzeczą w stwierdzeniach, które zaczynają się od „ludzie powinni”, jest to, że prawie zawsze można zastąpić „ludzie nie będą”, a stwierdzenie to nadal sprawdza się jako prawdziwe.
magi182
1
@ magi182 Mógłbym chyba zrobić sto fajnie, żeby linie kodu uzupełniały powyższy kod.
frodeborli
-1

możesz także użyć get_posts( $args )zamiast wp_Query(), co da ci listę postów

Alon Gouldman
źródło