Bagaimana cara mendapatkan array data posting dari hasil wp_query?


35

Saat menjalankan kueri dengan metode WP_Query, saya mendapat objek. Saya mengerti bahwa saya kemudian dapat melakukan loop untuk menampilkan barang. Tetapi, tujuan saya bukan untuk menampilkan apa pun, sebagai gantinya, saya ingin mendapatkan beberapa data pos dengan melakukan sesuatu seperti "foreach ...". Bagaimana saya bisa mendapatkan larik data pos yang dapat saya lewati dan dapatkan data?


2
Perbedaan penting yang perlu diingat antara mengakses data pos secara langsung versus menggunakan tag templat adalah bahwa filter tidak diterapkan pada data dan beberapa fungsi mungkin rusak.
Milo

Jawaban:


73

Anda harus membaca referensi fungsi untuk WP_Query pada kodeks WordPress. Di sana Anda memiliki banyak contoh untuk dilihat. Jika Anda tidak ingin mengulang set hasil menggunakan while, Anda bisa mendapatkan semua posting dikembalikan oleh permintaan dengan WP_Querydi properti posts.

Sebagai contoh

$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
Namun, tidak ada contoh yang Anda tautkan yang menunjukkan cara memproses posting. Jadi ada baiknya Anda menjawab, sayang mereka tidak memilikinya dalam dokumentasi. Kiat lain: Jika Anda melakukan kecocokan pada pos unik, Anda dapat menggunakan fungsi seperti ini dengan 'posts_per_page'=>1di 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: Anda seorang suci! Sangat cocok untuk menghindari get_the_title / ID / younameit.
Vial

8
Sebaiknya Anda menggunakan $query->posts, $query->get_posts()akan memicu pengerjaan ulang penguraian kueri dan permintaan basis data tambahan yang tidak perlu
Tom J Nowell

$ query-> get_posts (); tidak berfungsi seperti yang diharapkan. Tidak yakin mengapa tetapi mengembalikan lebih sedikit pos daripada kueri. Lihat di sini: stackoverflow.com/questions/25395299/…
Laxmana

1
Jawaban ini benar-benar salah, ketika Anda membuat WP_Query baru dengan beberapa argumen, metode get_posts () langsung dipanggil secara internal dan Anda TIDAK HARUS MENGHUBUNGKANNYA! Jika Anda memanggilnya lagi seperti yang ditunjukkan pada contoh di atas, ia akan menjalankan kueri yang BERBEDA, tergantung pada argumen dan hasil dari proses awal (set bendera internal, dll.), Dan berpotensi dapat mengembalikan serangkaian hasil (lebih kecil) yang berbeda atau tidak ada hasil sama sekali. Seperti yang disarankan TomJNowell dan Laxmana di atas, orang harus menggunakan $ query-> posts untuk mendapatkan data postingan.
ivanhoe

11

Sebenarnya, Anda tidak perlu menolak untuk menggunakan while()loop. Objek WP_Post yang sama sudah disimpan di postproperti:

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

2
Tidak, iftidak berlebihan. Dalam kasus yang tepat ini, tetapi dalam sebagian besar situasi produksi, Anda memiliki kode untuk dieksekusi antara if dan the while.
magi182

2
@ magi182 Yang membuatnya mubazir, dalam kasus yang tepat ini. Orang harus belajar kapan harus menggunakan ini.
frodeborli

4
@frodeborli, Hal yang menyenangkan tentang pernyataan yang dimulai dengan "orang harus" adalah bahwa Anda hampir selalu dapat menggantikan "orang tidak akan" dan pernyataan itu masih diuji sebagai benar.
magi182

1
@ magi182 Saya mungkin bisa membuat seratus bagus untuk memiliki baris kode untuk melengkapi kode di atas.
frodeborli

-1

Anda juga dapat menggunakan get_posts( $args )alih-alih wp_Query(), yang akan memberi Anda daftar posting

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.