Dapatkan id pos dari WP_Query?

27

Apakah ada cara saya dapat mengambil array id pos yang diminta dari yang berikut:

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3
));

if ( $latest -> have_posts() ) : while ( $latest -> have_posts() ) : $latest -> the_post();

    get_template_part( 'templates/content', 'post' );

endwhile; endif; wp_reset_postdata();

Mengikuti:

Saya dulu wp_list_pluckmengambil array id pos:

$post_ids = wp_list_pluck( $latest->posts, 'ID' );

Kemudian dikonversi array menjadi string menggunakan fungsi implode:

$post_ids_string = implode( ',', $post_ids );

Maaf atas pertanyaan yang mendua.

Kaya
sumber
Rick, pertanyaan Anda ambigu. Harap sangat jelas apa yang Anda inginkan sebelum mengirim pertanyaan. Ini akan menyelamatkan semua orang dari menjawab hal-hal yang tidak relevan. Anda sebenarnya memerlukan ID posting yang dikembalikan dalam sebuah string, bukan sebuah array
Pieter Goosen
1
Anda wp_reset_postdataharus berada di dalam bukan di luar pernyataan if, jika tidak, Anda dapat mengatur ulang data pos saat belum diubah
Tom J Nowell
1
Jika Anda hanya menginginkan ID, Anda harus mempertimbangkan dengan serius jawaban s_ha_dum. Itu akan mengembalikan ID tanpa juga mengambil banyak data lain dari database yang kemudian Anda buang.
Chris Rae

Jawaban:

43

Mencoba

$post_ids = wp_list_pluck( $latest->posts, 'ID' );

Baca baca wp_list_pluck

shanebp
sumber
5
Ini dapat bermanfaat jika Anda juga membutuhkan seluruh data untuk setiap posting, bukan hanya id posting. Kalau tidak, saya akan pergi dengan solusi @ s-ha-dum.
Marian
74

Gunakan fieldsargumen dalam kueri Anda.

bidang (string) - Bidang mana yang harus dikembalikan. Semua bidang dikembalikan secara
default. Ada dua opsi lain: - 'id' - Mengembalikan array ID posting. - 'id => parent' - Mengembalikan array asosiatif [parent => ID, ...].

http://codex.wordpress.org/Class_Reference/WP_Query#Return_Fields_Parameter

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3,
    'fields' => 'ids'
));
var_dump($latest->posts);
s_ha_dum
sumber
12
Ini harus menjadi jawaban yang diterima karena hanya menanyakan ID membuatnya jauh lebih cepat daripada quering everyhing dan daripada 'memetik' (loop dan menyimpan kembali) dalam array baru.
Barry Kooij
Mungkin Anda perlu mendapatkan ID SETELAH normal wp_query telah dijalankan, misalnya ketika Anda menggabungkan dua permintaan sesudahnya dan membutuhkan ID untuk mengecualikan hasil dari permintaan sebelumnya.
trainoasis
2

Menggunakan solusi dari @ s-ha-dum adalah ekonomis jika Anda hanya perlu mendapatkan id, dan Anda tidak memiliki set objek query sebelumnya.

Inilah alasannya:

switch ( $q['fields'] ) {
    case 'ids':
        $fields = "$wpdb->posts.ID";
        break;
    case 'id=>parent':
        $fields = "$wpdb->posts.ID, $wpdb->posts.post_parent";
        break;
    default:
        $fields = "$wpdb->posts.*";

Karena jika Anda hanya menentukan 'fields' => 'ids'tidak lebih dari yang akan Anda dapatkan sebagai ganti ID.

Jika Anda akan pergi dengan 'fields' => 'id=>parent'(Terlihat sangat lucu), Anda juga akan mendapatkan ID orang tua.

Cara lain menggunakan 'fields'argumen tidak akan berdampak apa pun pada WordPress v4.7.

Tetapi jika Anda memiliki permintaan seperti dalam contoh wp_list_pluckakan melakukan pekerjaan.

prosti
sumber