Làm thế nào để có được tất cả các bài viết với bất kỳ trạng thái bài viết?


38

Tôi đang tạo một bảng điều khiển phía trước nơi tôi cần hiển thị tất cả các bài đăng của người dùng hiện tại. Vì vậy, tôi cần phải hiển thị bài viết nào trong tất cả các nước, chủ yếu là published, trashedpending. Bây giờ tôi đang sử dụng một truy vấn đơn giản nhưng nó chỉ trả về các bài đăng được xuất bản.

$query = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID              
    );
    query_posts($query);

Có ai giúp được không? Tôi cần làm gì khác?


4
Bạn đã thử sử dụng post_statustham số , tức là. 'post_status' => 'any'?
t31os

2
Tôi mạnh mẽ khuyên bạn sử dụng WP_Query pre_get_postshoặc get_poststhay vì query_posts. Không bao giờ sử dụngquery_posts
Tom J Nowell

@TomJNowell: đó là cách trở lại :) Tôi sử dụng WP_Query nhiều nhất bây giờ ..
Sisir

1
@Sisir hãy cẩn thận, sử dụng WP_Querycho giao diện người dùng và get_postscho các truy vấn của quản trị viên vì có vấn đề với wp_reset_postdata(xem ghi chú về vấn đề này).
Aurovrata

Câu trả lời:


65

Bạn có thể sử dụng tham số post_status:

* 'publish' - a published post or page
* 'pending' - post is pending review
* 'draft' - a post in draft status
* 'auto-draft' - a newly created post, with no content
* 'future' - a post to publish in the future
* 'private' - not visible to users who are not logged in
* 'inherit' - a revision. see get_children.
* 'trash' - post is in trashbin. added with Version 2.9. 

Tôi không chắc chắn rằng nó chấp nhận 'bất kỳ' vì vậy sử dụng và mảng với tất cả các loại bạn muốn:

$query = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID,
    'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')    
);
$loop = new WP_Query($query);

while ( $loop->have_posts() ) : $loop->the_post();

7
Bạn cũng có thể sử dụng get_post_stati()để có được tất cả các trạng thái, bao gồm cả trạng thái tùy chỉnh.
fuxia

5
Một cơ hội lãng phí để giết chết một query_postscuộc gọi ...
Tom J Nowell

quá xấu chúng ta không thể làm điều gì đó như thế này 'post_status' => array( '!inherit' );(để chỉ bất kỳ post_status khác hơn là kế thừa)
aequalsb

@aequalsb những gì về'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab

9

Có một cách đơn giản, làm thế nào để có được tất cả các bài đăng với bất kỳ trạng thái nào:

$articles = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => get_post_types('', 'names'),
 )
);

Bây giờ bạn có thể lặp đi lặp lại trong tất cả các bài viết:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}

2
$ bài viết và $ bài viết xung đột với tên biến riêng của Wordpress . Nếu bạn đang sử dụng mã này để đặt một cái gì đó khác với div chính (nội dung chính), điều này sẽ ghi đè lên những gì sẽ được hiển thị trong chính. Nếu ý định của bạn thực sự là thay thế hoàn toàn kết quả truy vấn ban đầu, thì đây là điều bạn muốn, tất nhiên. Nhưng vẫn là một ý tưởng tốt để đổi tên các biến $ post và $ post.
Henrik Erlandsson

5
@Henrik Tôi không có ý định giảm bình luận của bạn (logic của bạn là âm thanh và an toàn), nhưng tôi coi việc sử dụng bài đăng $ post / $ là hoàn toàn chấp nhận được trong một hàm mà không truy cập vào các biến $ post / $ post toàn cầu - bởi vì nó giúp tôi duy trì logic trong quá trình phát triển.
aequalsb

6

Các WP_Queryphương pháp lớp học ->query()chấp nhận một anyđối số cho post_status. Xem wp_get_associated_nav_menu_items()để chứng minh.

Điều tương tự cũng xảy ra get_posts()(chỉ là một trình bao bọc cho cuộc gọi trên).


3
Từ các tài liệu WP_Query: 'any' - truy xuất bất kỳ trạng thái nào ngoại trừ các trạng thái từ các loại bài đăng với 'Elim_from_search' được đặt thành đúng. (Có một lỗi đánh máy ở đó, chúng thực sự có nghĩa là trạng thái bài thay vì loại bài.) Điều này có nghĩa là trạng thái auto-drafttrashđược loại trừ.
Tamlyn

@Tamlyn Afaik, đây không phải là lỗi chính tả. Nó lấy bất kỳ trạng thái từ các loại bài đăng được công khai. Tình trạng chỉ là điều khoản. Họ không có tài sản công cộng hoặc tư nhân . Bạn có thể vô hiệu hóa một nguyên tắc phân loại với việc vô hiệu hóa query_var... vì bất kỳ lý do gì người ta sẽ làm điều đó. Phụ chú: Các số nhiều của bài tình trạng là ... .
kaiser

1
Nếu bạn theo dõi mã (thường dễ hơn đọc tài liệu, tôi tìm thấy), bạn có thể thấy rằng WP_Query#get_posts()gọi get_post_stati()bộ lọc nào $wp_post_statusescho các giá trị exclude_from_searchlà đúng thì nó sẽ loại trừ các bài đăng có các trạng thái này khỏi truy vấn. Có một quy trình tương tự cho các loại bài đăng khi post_type được đặt thành 'bất kỳ'.
Tamlyn

@Tamlyn Sau khi kiểm tra nội dung của $wp_post_statusestài sản, tôi phải thừa nhận rằng bạn đúng :)
kaiser

không hoạt động cho tình trạng rác.
Maxwell sc

2

Trong hầu hết các trường hợp, bạn có thể sử dụng get_posts()với 'any'tham số cho việc này:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => 'my-post-type',
 )
);

Nhưng theo cách này bạn sẽ không nhận được bài đăng có trạng thái trashauto-draft. Bạn cần cung cấp cho họ một cách rõ ràng, như thế này:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any, trash, auto-draft',
  'post_type' => 'my-post-type',
 )
);

Hoặc bạn có thể sử dụng hàm get_post_stati () để cung cấp rõ ràng tất cả các trạng thái hiện có:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => get_post_stati(),
  'post_type' => 'my-post-type',
 )
);

1

Thậm chí nếu bạn vượt qua anynhư post_status, bạn vẫn sẽ không nhận được bài trong kết quả nếu tất cả các điều kiện sau là đúng:

  1. Một bài viết đang được truy vấn. Một ví dụ về điều này sẽ được truy vấn bởi name, tức là sên.
  2. Bài đăng có trạng thái bài đăng không công khai.
  3. Máy khách không có phiên quản trị viên đang hoạt động, tức là bạn hiện chưa đăng nhập.

Dung dịch

Truy vấn rõ ràng cho mọi trạng thái. Ví dụ: để truy vấn stati không trashhoặc auto-draft(rất khó có khả năng bạn muốn những thứ đó), bạn có thể làm một cái gì đó như thế này:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
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.