Làm thế nào để có được một mảng dữ liệu bài đăng từ kết quả wp_query?


35

Khi chạy truy vấn với phương thức WP_Query, tôi có một đối tượng. Tôi hiểu rằng sau đó tôi có thể thực hiện các vòng lặp để hiển thị các công cụ. Nhưng, mục tiêu của tôi là không hiển thị bất cứ thứ gì, thay vào đó, tôi muốn nhận được một số dữ liệu bài đăng bằng cách thực hiện một cái gì đó như "foreach ...". Làm thế nào tôi có thể có được một mảng dữ liệu bài đăng mà tôi có thể lặp qua và lấy dữ liệu?


2
Một sự khác biệt quan trọng cần lưu ý giữa việc truy cập trực tiếp dữ liệu bài đăng so với sử dụng thẻ mẫu là các bộ lọc không được áp dụng cho dữ liệu và một số chức năng có thể bị hỏng.
Milo

Câu trả lời:


73

Bạn nên đọc tham chiếu chức năng cho WP_Query trên bộ mã WordPress. Ở đó bạn có rất nhiều ví dụ để xem xét. Nếu bạn không muốn lặp lại tập kết quả bằng cách sử dụng a while, bạn có thể nhận được tất cả các bài đăng được trả về bởi truy vấn có WP_Querytrong thuộc tính posts.

Ví dụ

$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
Mặc dù vậy, không có ví dụ nào bạn liên kết để trình bày cách xử lý bài viết. Vì vậy, thật tốt khi bạn trả lời, thật đáng tiếc họ không có nó trong tài liệu. Một mẹo khác: Nếu bạn đang thực hiện một trận đấu trên một bài đăng độc đáo, bạn có thể sử dụng một chức năng như thế này với 'posts_per_page'=>1trong 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: Bạn là một vị thánh! Tuyệt vời để phá vỡ get_the_title / ID / younameit.
Lọ

8
$query->postsThay vào đó, bạn nên sử dụng , $query->get_posts()sẽ kích hoạt chạy lại phân tích cú pháp truy vấn và các truy vấn cơ sở dữ liệu không cần thiết bổ sung
Tom J Nowell

$ truy vấn-> get_posts (); không hoạt động như mong đợi. Không chắc chắn tại sao nhưng nó trả về ít bài hơn truy vấn. Xem tại đây: stackoverflow.com/questions/25395299/
Mạnh

1
Câu trả lời này hoàn toàn sai, khi bạn tạo WP_Query mới với một số đối số, phương thức get_posts () được gọi bên trong ngay lập tức và bạn KHÔNG NÊN GỌI NÓ! Nếu bạn gọi lại như trong ví dụ ở trên, nó sẽ chạy truy vấn KHÁC BIỆT, tùy thuộc vào các đối số và kết quả tạo thành lần chạy ban đầu (đặt cờ nội bộ, v.v.) và có khả năng trả về một tập kết quả khác (nhỏ hơn) hoặc không có kết quả nào cả. Như TomJNowell và Laxmana đã đề xuất ở trên, nên sử dụng $ query-> bài đăng để lấy dữ liệu bài đăng.
ivanhoe

11

Trên thực tế, bạn không cần phải từ chối sử dụng while()vòng lặp. Cùng một đối tượng WP_Post đã được lưu trữ trong thuộc posttính:

        $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
iflà dư thừa.
Akkumulator

2
Không, ifkhông dư thừa. Trong trường hợp chính xác này, nhưng trong hầu hết các tình huống sản xuất, bạn có mã để thực thi giữa if và while.
magi182

2
@ magi182 Điều này làm cho nó dư thừa, trong trường hợp chính xác này. Mọi người nên tìm hiểu khi sử dụng này.
frodeborli

4
@frodeborli, Điều hay ho về những câu bắt đầu bằng "mọi người nên" là bạn hầu như luôn có thể thay thế "mọi người sẽ không" và tuyên bố vẫn kiểm tra là đúng.
magi182

1
@ magi182 Tôi có thể tạo ra một trăm dòng mã đẹp để bổ sung cho đoạn mã trên.
frodeborli

-1

bạn cũng có thể sử dụng get_posts( $args )thay vì wp_Query(), nó sẽ cung cấp cho bạn một danh sách các bài viết

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.