Bagaimana Cara Mendapatkan Semua Posting dengan status posting apa saja?


38

Saya membuat dashboard ujung depan di mana saya harus menunjukkan semua posting oleh pengguna saat ini. Jadi, saya perlu menunjukkan pos di semua negara bagian, terutama published, trasheddan pending. Saya sekarang menggunakan permintaan sederhana tetapi hanya mengembalikan posting yang diterbitkan.

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

Adakah yang bisa membantu? Apa lagi yang harus saya lakukan?


4
Sudahkah Anda mencoba menggunakan post_statusparameter , yaitu. 'post_status' => 'any'?
t31os

2
Saya sangat merekomendasikan menggunakan WP_Query pre_get_postsatau get_postsbukan query_posts. Jangan pernah gunakanquery_posts
Tom J Nowell

@ TomJNowell: itu jalan kembali :) Saya menggunakan WP_Query paling sering sekarang ..
Sisir

1
@Sisir hati-hati, gunakan WP_Queryuntuk front-end, dan get_postsuntuk permintaan admin karena ada masalah dengan wp_reset_postdata(lihat catatan dan tiket tentang masalah ini).
Aurovrata

Jawaban:


65

Anda dapat menggunakan parameter 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. 

Saya tidak yakin menerima 'any' jadi gunakan dan susun dengan semua jenis yang Anda inginkan:

$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
Anda juga dapat menggunakan get_post_stati()untuk mendapatkan semua status, termasuk yang khusus.
fuxia

5
Kesempatan yang sia-sia untuk mematikan query_postspanggilan ...
Tom J Nowell

Sayang sekali kami tidak dapat melakukan sesuatu seperti ini 'post_status' => array( '!inherit' );(untuk menunjukkan post_status selain pewarisan)
aequalsb

@aequalsb bagaimana'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab

9

Ada cara sederhana, bagaimana cara mendapatkan semua posting dengan status apa pun:

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

Sekarang Anda dapat mengulangi seluruh posting:

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

2
$ post dan $ post konflik dengan nama variabel Wordpress sendiri . Jika Anda menggunakan kode ini untuk meletakkan sesuatu di luar div utama (konten utama), ini akan menimpa apa yang akan ditampilkan di main. Jika niat Anda benar-benar adalah untuk sepenuhnya menggantikan hasil permintaan asli, ini yang Anda inginkan, tentu saja. Namun masih merupakan ide bagus untuk mengubah nama variabel $ post dan $ post.
Henrik Erlandsson

5
@ Henrik saya tidak bermaksud mengurangi komentar Anda sama sekali (logika Anda sehat dan aman), tetapi saya mempertimbangkan untuk menggunakan $ post / $ posts sebagai hal yang dapat diterima di dalam suatu fungsi tanpa akses ke variabel $ post / $ posts global - karena ini membantu saya menjaga logika selama pengembangan.
aequalsb

6

The WP_Querymetode kelas ->query()menerima sebuah anyargumen untuk post_status. Lihat wp_get_associated_nav_menu_items()bukti.

Hal yang sama berlaku untuk get_posts()(yang hanya pembungkus untuk panggilan di atas).


3
Dari dokumen WP_Query: 'any' - mengambil status apa pun kecuali dari tipe posting dengan 'exclude_from_search' disetel ke true. (Ada kesalahan ketik di sana, itu sebenarnya berarti status posting dan bukan jenis posting.) Ini berarti status auto-draftdan trashdikecualikan.
Tamlyn

@Tamlyn Afaik, ini bukan salah ketik. Itu mengambil status apa pun dari jenis posting yang tersedia untuk umum. Status hanyalah istilah. Mereka tidak punya properti publik atau pribadi sendiri. Anda dapat menonaktifkan taksonomi dengan menonaktifkan query_var... untuk alasan apa pun orang akan melakukannya. Sidenote: The jamak status pos ... .
kaiser

1
Jika Anda menelusuri kode (seringkali lebih mudah daripada membaca dokumen, saya menemukan) Anda dapat melihat WP_Query#get_posts()panggilan get_post_stati()mana yang menyaring $wp_post_statusesnilai di mana exclude_from_searchbenar maka tidak termasuk posting dengan status ini dari kueri. Ada proses serupa untuk jenis posting ketika post_type diatur ke 'apa saja'.
Tamlyn

@Tamlyn Setelah memeriksa konten $wp_post_statusesproperti, saya harus mengakui bahwa Anda benar :)
kaiser

tidak berfungsi untuk status sampah.
Maxwell sc

2

Dalam kebanyakan kasus, Anda dapat menggunakan get_posts()dengan 'any'parameter untuk ini:

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

Tetapi dengan cara ini Anda tidak akan mendapatkan kiriman dengan status trashdan auto-draft. Anda harus menyediakannya secara eksplisit, seperti ini:

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

Atau Anda dapat menggunakan fungsi get_post_stati () untuk memberikan semua status yang ada secara eksplisit:

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

1

Meskipun Anda lulus anysebagai post_status, Anda tetap tidak akan mendapatkan pos di hasilnya jika semua kondisi berikut ini benar:

  1. Satu pos sedang ditanya. Contoh dari ini adalah query oleh name, yaitu siput.
  2. Pos memiliki status pos yang tidak publik.
  3. Klien tidak memiliki sesi admin aktif, yaitu Anda saat ini tidak masuk.

Larutan

Permintaan secara eksplisit untuk setiap status. Misalnya, untuk meminta stati yang bukan trashatau auto-draft(sepertinya Anda tidak menginginkannya), Anda dapat melakukan sesuatu seperti ini:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.