Jak uzyskać wszystkie posty z dowolnym statusem?

38

Tworzę pulpit nawigacyjny, w którym muszę pokazać wszystkie posty bieżącego użytkownika. Tak, muszę pokazać posty we wszystkich stanach, głównie published, trasheda pending. Teraz używam prostego zapytania, ale zwraca tylko opublikowane posty.

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

Czy ktoś może pomóc? Co jeszcze muszę zrobić?

Sisir
źródło
4
Czy próbowałeś użyć post_statusparametru , tj. 'post_status' => 'any'?
t31os 30.03.11
2
I zdecydowanie zalecamy użycie WP_Query pre_get_postslub get_postszamiast query_posts. Nigdy nie używajquery_posts
Tom J Nowell
@TomJNowell: to było dawno temu :) Najczęściej używam WP_Query ..
Sisir
1
@ Zachowaj ostrożność, korzystaj WP_Queryz interfejsu użytkownika i get_postszapytań administracyjnych, ponieważ występuje problem wp_reset_postdata(patrz uwaga i bilet na ten temat).
Aurovrata,

Odpowiedzi:

65

Możesz użyć parametru 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. 

Nie jestem pewien, czy akceptuje „dowolny”, więc używaj i tablicuj wszystkie typy, które chcesz:

$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();
Bainternet
źródło
7
Możesz także użyć, get_post_stati()aby uzyskać wszystkie statusy, w tym niestandardowe.
fuxia
5
Zmarnowana okazja, by zabić query_postsrozmowę ...
Tom J Nowell
szkoda, że ​​nie możemy zrobić czegoś takiego 'post_status' => array( '!inherit' );(aby wskazać stan post_status inny niż dziedziczenie)
aequalsb
@aequalsb co z'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab
9

Jest prosty sposób, jak uzyskać wszystkie posty o dowolnym statusie:

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

Teraz możesz iterować wszystkie posty:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
OzzyCzech
źródło
2
$ posts i $ post są w konflikcie z własnymi nazwami zmiennych Wordpress . Jeśli używasz tego kodu, aby wstawić coś do div innego niż główny (główny), spowoduje to zastąpienie tego, co pokazano w main. Jeśli naprawdę chcesz całkowicie zastąpić oryginalne wyniki zapytania, oczywiście tego właśnie chcesz. Ale nadal dobrym pomysłem jest zmiana nazw zmiennych $ posts i $ post.
Henrik Erlandsson
5
@Henrik wcale nie zamierzam pomniejszać twojego komentarza (twoja logika jest rozsądna i bezpieczna), ale uważam, że użycie $ post / $ posts jest całkowicie dopuszczalne w funkcji bez dostępu do zmiennych globalnych $ post / $ posts - ponieważ pomaga mi zachować logikę podczas programowania.
aequalsb
6

Metoda WP_Queryklasy ->query()akceptuje anyargument dla post_status. Zobacz wp_get_associated_nav_menu_items()dowód.

To samo dotyczy get_posts()(co jest tylko opakowaniem dla powyższego połączenia).

kajzer
źródło
3
Z dokumentów WP_Query: „any” - pobiera dowolny status oprócz tych z typów postów z ustawieniem „exclude_from_search” na true. (Jest tam literówka, faktycznie oznaczają statusy postów zamiast typów postów.) Oznacza to statusy auto-drafti trashsą wykluczone.
Tamlyn
@Tamlyn Afaik, to nie literówka. To pobiera żadnego statusu ze stanowiska typów , które są publicznie dostępne. Status to tylko warunki. Sami nie uzyskali własności publicznej ani prywatnej . Państwo mogłoby wyłączyć taksonomii z wyłączając query_var... z jakiegoś powodu ktoś miałby to robić. Sidenote: Liczba mnoga od statusu postu jest ... .
kaiser
1
Jeśli prześledzisz kod (często łatwiejsze niż czytanie dokumentów, widzę), możesz zobaczyć, że WP_Query#get_posts()wywołania, get_post_stati()które filtrują $wp_post_statuseswartości, gdzie exclude_from_searchjest prawda, wyklucza posty z tymi statusami z zapytania. Podobny proces dotyczy typów postów, gdy typ post_ty jest ustawiony na „any”.
Tamlyn
@Tamlyn Po sprawdzeniu zawartości $wp_post_statusesnieruchomości, muszę przyznać, że masz rację :)
kaiser
nie działa dla statusu kosza.
Maxwell sc
2

W większości przypadków można użyć get_posts()z 'any'parametrem do tego:

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

Ale w ten sposób nie będziesz otrzymywać postów ze statusem trashi auto-draft. Musisz podać je jawnie, w następujący sposób:

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

Możesz też użyć funkcji get_post_stati (), aby jawnie podać wszystkie istniejące statusy:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => get_post_stati(),
  'post_type' => 'my-post-type',
 )
);
Siergiej Zaharchenko
źródło
1

Nawet jeśli zdasz anyjako post_status, nadal nie otrzymasz postu, jeśli spełnione są wszystkie następujące warunki:

  1. Pytany jest pojedynczy post. Przykładem może być zapytanie name, np. Ślimaka.
  2. Wpis ma status niepubliczny.
  3. Klient nie ma aktywnej sesji administratora, tzn. Nie jesteś aktualnie zalogowany.

Rozwiązanie

Zapytanie wprost dla każdego statusu. Na przykład, aby zapytać o statystyki, które nie są trashlub auto-draft(jest mało prawdopodobne, że ich potrzebujesz), możesz zrobić coś takiego:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
XedinUnknown
źródło