รับรหัสโพสต์จาก WP_Query


27

มีวิธีที่ฉันสามารถดึงอาเรย์ของรหัสโพสต์ที่สอบถามจากสิ่งต่อไปนี้:

$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();

ติดตาม:

ฉันใช้wp_list_pluckเพื่อดึงอาเรย์ของรหัสโพสต์:

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

จากนั้นแปลงอาร์เรย์เป็นสตริงโดยใช้ฟังก์ชัน implode:

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

ขออภัยสำหรับคำถามที่ไม่ชัดเจน


Rick คำถามของคุณคลุมเครือ โปรดระบุสิ่งที่คุณต้องการอย่างชัดเจนก่อนโพสต์คำถาม สิ่งนี้จะช่วยให้ทุกคนไม่ตอบคำถามที่ไม่เกี่ยวข้อง คุณต้องส่งคืน ID โพสต์ในสตริงไม่ใช่อาร์เรย์
Pieter Goosen

1
คุณwp_reset_postdataควรอยู่ภายในนอกเหนือจากคำสั่ง if มิฉะนั้นคุณอาจรีเซ็ตข้อมูลโพสต์เมื่อไม่มีการเปลี่ยนแปลง
Tom J Nowell

1
หากคุณต้องการ ID เท่านั้นคุณควรพิจารณาคำตอบของ s_ha_dum อย่างจริงจัง นั่นจะส่งคืน ID โดยไม่ต้องดึงข้อมูลอื่น ๆ มากมายจากฐานข้อมูลที่คุณทิ้งไป
Chris Rae

คำตอบ:


43

ลอง

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

อ่าน wp_list_pluck


5
สิ่งนี้มีประโยชน์หากคุณต้องการข้อมูลทั้งหมดสำหรับแต่ละโพสต์ไม่ใช่เฉพาะรหัสโพสต์ มิฉะนั้นฉันจะไปกับการแก้ปัญหาของ @ s-ha-dum
Marian

74

ใช้fieldsอาร์กิวเมนต์ในแบบสอบถามของคุณ

เขตข้อมูล (สตริง) - เขตข้อมูลใดที่จะส่งคืน ฟิลด์ทั้งหมดจะถูกส่งกลับโดย
ค่าเริ่มต้น มีสองตัวเลือกอื่น ๆ : - 'รหัส' - ส่งคืนอาร์เรย์ของรหัสโพสต์ - 'id => parent' - ส่งคืนอาร์เรย์ที่เชื่อมโยง [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);

12
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเพราะมันจะสืบค้นเฉพาะ ID ที่ทำให้มันเร็วกว่าการสืบค้นทุกอย่างและมากกว่า 'การถอน' (วนซ้ำและการจัดเก็บใหม่) ในอาร์เรย์ใหม่
Barry Kooij

บางทีคุณอาจจำเป็นต้องได้รับ ID หลังจากที่ wp_query ปกติได้รับการดำเนินการแล้วตัวอย่างเช่นเมื่อคุณรวมสองคิวรีหลังจากนั้นและต้องการ ID เพื่อแยกผลลัพธ์จากการค้นหาก่อนหน้า
trainoasis

2

การใช้โซลูชันจาก @ s-ha-dum นั้นประหยัดถ้าคุณต้องการรับ id เท่านั้นและคุณไม่มีชุดวัตถุคิวรีก่อนหน้า

นี่คือเหตุผล:

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.*";

เพราะในกรณีที่คุณ'fields' => 'ids'ไม่ได้ระบุอะไรเพิ่มเติมคุณจะได้รับผลตอบแทนมากกว่า ID

ถ้าคุณจะไปด้วย'fields' => 'id=>parent'(ดูตลกจริงๆ) คุณจะได้รับ ID ผู้ปกครองด้วย

วิธีอื่น ๆ ที่ใช้การ'fields'โต้แย้งจะไม่มีผลกระทบใด ๆ ตั้งแต่ WordPress v4.7

แต่ในกรณีที่คุณมีแบบสอบถามเช่นในตัวอย่างwp_list_pluckจะทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.