Nhận id bài đăng từ WP_Query?


27

Có cách nào để tôi có thể truy xuất một mảng các id bài được truy vấn từ các mục sau:

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

Theo sát:

Tôi đã sử dụng wp_list_pluckđể lấy một loạt các id bài viết:

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

Sau đó chuyển đổi mảng thành một chuỗi bằng hàm implode:

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

Xin lỗi vì câu hỏi mơ hồ.


rick, câu hỏi của bạn là mơ hồ. Xin hãy thật rõ ràng những gì bạn muốn trước khi đăng một câu hỏi. Điều này sẽ cứu tất cả mọi người khỏi trả lời những thứ không liên quan. Bạn thực sự cần ID bài đăng được trả về trong một chuỗi, không phải là một mảng
Pieter Goosen

1
Bạn wp_reset_postdatanên ở bên trong không nằm ngoài câu lệnh if, nếu không, bạn có thể đặt lại dữ liệu bài đăng khi nó chưa được thay đổi
Tom J Nowell

1
Nếu bạn chỉ muốn ID, bạn nên nghiêm túc xem xét câu trả lời của s_ha_dum. Điều đó sẽ trả về ID mà không cần lấy nhiều dữ liệu khác từ cơ sở dữ liệu mà sau đó bạn vứt đi.
Chris Rae

Câu trả lời:


43

Thử

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

Đọc wp_list_pluck


5
Điều này có thể hữu ích nếu bạn cũng cần toàn bộ dữ liệu cho mỗi bài đăng, không chỉ các id bài đăng. Nếu không, tôi sẽ đi với giải pháp của @ s-ha-dum.
Mary

74

Sử dụng fieldsđối số trong truy vấn của bạn.

các trường (chuỗi) - Những trường nào để trả về. Tất cả các trường được trả lại theo
mặc định. Có hai tùy chọn khác: - 'id' - Trả về một mảng ID bài đăng. - 'id => Parent' - Trả về một mảng kết hợp [cha => 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
Đây phải là câu trả lời được chấp nhận vì nó chỉ truy vấn ID khiến nó nhanh hơn rất nhiều so với việc truy vấn mọi thứ và hơn là 'nhổ lông' (lặp và lưu trữ lại) trong một mảng mới.
Barry Kooij

Có lẽ bạn cần nhận ID SAU KHI bình thường wp_query đã được thực thi, ví dụ như khi bạn hợp nhất hai truy vấn sau đó và cần ID để loại trừ kết quả khỏi truy vấn trước đó.
đào tạo

2

Sử dụng giải pháp từ @ s-ha-dum là kinh tế nếu bạn chỉ cần lấy id và bạn không có bộ đối tượng truy vấn trước đó.

Đây là lý do tại sao:

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

Bởi vì trong trường hợp bạn chỉ xác định 'fields' => 'ids'không có gì bạn sẽ nhận được nhiều hơn so với ID.

Nếu bạn đi cùng 'fields' => 'id=>parent'(Trông rất buồn cười), bạn cũng sẽ nhận được ID cha.

Bất kỳ cách nào khác sử dụng 'fields'đối số sẽ không có bất kỳ tác động nào kể từ WordPress v4.7.

Nhưng trong trường hợp bạn có truy vấn như trong ví dụ wp_list_plucksẽ thực hiện công việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.