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ć?


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;
}

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.

            }

        }

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.