Herhangi bir gönderi durumu olan tüm gönderileri nasıl alabilirim?


38

Geçerli kullanıcının tüm gönderilerini göstermem gereken bir uç gösterge paneli oluşturuyorum. Yani, esas olarak, tüm eyaletlerde mesajları göstermek gerekir published, trashedve pending. Şimdi basit bir sorgu kullanıyorum, ancak yalnızca yayınlanmış yayınları döndürüyor.

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

Biri yardım edebilir mi? Başka ne yapmam gerekiyor?


4
Yani post_statusparametre kullanmayı denediniz mi? 'post_status' => 'any'?
t31os

2
Ben şiddetle kullanmanızı tavsiye WP_Query pre_get_postsveya get_postsyerine query_posts. Asla kullanmaquery_posts
Tom J Nowell

@TomJNowell: Bu çok geri döndü :) Şimdi en çok WP_Query kullanıyorum ..
Sisir

1
@Siriş dikkatli olun, WP_Queryön uç get_postsiçin ve bir sorun olduğu için yönetici sorguları için kullanın wp_reset_postdata( bu konuyla ilgili not ve bilete bakın ).
Aurovrata,

Yanıtlar:


65

Post_status parametresini kullanabilirsiniz:

* '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. 

'Herhangi birini' kabul ettiğinden emin değilim, bu yüzden kullanmak ve istediğiniz tüm türlerle dizi kullanı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
get_post_stati()Özel olanlar da dahil olmak üzere tüm durumları almak için de kullanabilirsiniz .
fuxia

5
Bir query_postsaramayı kapatmak için boşa giden bir fırsat ...
Tom J Nowell

çok kötü biz böyle bir şey yapamayız 'post_status' => array( '!inherit' );(kalıtım dışında herhangi bir post_status belirtmek için)
aequalsb

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

9

Herhangi bir statüde tüm mesajların nasıl alınacağının basit bir yolu var:

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

Artık tüm yayınlar boyunca yinelenebilirsiniz:

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

2
$ posts ve $ post, Wordpress'in kendi değişken isimleriyle çakışıyor . Bu kodu, birincil (ana içerik) div'den başka bir yere koymak için kullanıyorsanız, bu, ana ekranda gösterilenin üzerine yazacaktır. Amacınız gerçekten orijinal sorgu sonuçlarını tamamen değiştirmekse, istediğiniz şey elbette. Ancak $ posts ve $ post değişkenlerini yeniden adlandırmak hala iyi bir fikirdir.
Henrik Erlandsson,

5
@Henrik Yorumunuzu hiç azaltmak istemiyorum (mantığınız sağlam ve güvenli), ancak $ post / $ posts işlevini global $ post / $ posts değişkenlerine erişimi olmayan bir işlev içinde kabul edilebilir olarak kullanmayı düşünüyorum - çünkü gelişim sırasında mantığı korumama yardımcı oluyor.
aequalsb

6

WP_QuerySınıf yöntemi ->query(), bir kabul anyiçin bağımsız değişken post_status. wp_get_associated_nav_menu_items()Bir kanıt için bakınız .

Aynı şey get_posts()(yukarıdaki çağrı için sadece bir sarıcı olan) için de geçerlidir.


3
WP_Query docs: 'any' - true olarak ayarlanmış 'exclude_from_search' olan yazı türleri dışında herhangi bir durumu alır. (Orada bir yazım hatası var, aslında post türleri yerine post statüsünü kastediyorlar.) Bu statular anlamına gelir auto-draftve trashhariç tutulur.
Tamlyn

@Tamlyn Afaik, bu yazım hatası değil. Bu Mesaja türlerinden herhangi durumunu alır herkes tarafından kullanılabilir. Durum sadece şartlar. Hiçbir var kamuoyunu veya özel mülkiyet kendileri. Sen olabilir devre dışı olan bir sınıflandırmasını devre dışı query_varolduğunu yapacağını sebebi ne olursa olsun bir için .... Sidenote: sonrası durumunun çoğul ... .
kaiser

1
Eğer kod üzerinden iz Eğer görebilirsiniz (docs okuma genellikle daha kolay, ben bulmak) WP_Query#get_posts()aramaları get_post_stati()filtreler $wp_post_statusesnerede değerleri için exclude_from_searchBunlarla o zaman dışlayan mesajlar doğrudur durumları sorgudan. Post_type 'any' olarak ayarlandığında post tipleri için benzer bir işlem vardır.
Tamlyn

@Tamlyn $wp_post_statusesMülk içeriğini kontrol ettikten sonra haklı olduğunuzu itiraf etmeliyim :)
kaiser

çöp durumu için çalışmıyor.
Maxwell sc

2

Çoğu durumda bunun için parametre get_posts()ile kullanabilirsiniz 'any':

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

Ama bu yolla trashve ile statü alamazsınız auto-draft. Onlara açıkça vermeniz gerekiyor, şöyle:

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

Veya mevcut tüm durumları açıkça sağlamak için get_post_stati () işlevini kullanabilirsiniz:

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

1

Eğer geçmek bile anyolarak post_status, sen hala sonuç yazı almazsınız aşağıdaki koşulların tümü doğruysa:

  1. Tek bir gönderi sorgulanıyor. Buna bir örnek name, yani sümüklü böcek tarafından sorgulanıyor olabilir .
  2. Gönderi, herkese açık olmayan bir gönderi durumuna sahip.
  3. İstemci aktif bir yönetici oturumuna sahip değil, yani şu anda giriş yapmadınız.

Çözüm

Her durum için açıkça sorgula . Örneğin, olmayan trashveya auto-draft(bunları istemeniz pek mümkün değildir) olan stati'yi sorgulamak için şöyle bir şey yapabilirsiniz:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.