Come ottenere tutti i post con qualsiasi stato di post?


38

Sto creando una dashboard front-end in cui devo mostrare tutti i post dell'utente corrente. Quindi, ho bisogno di mostrare post in tutti gli stati, principalmente published, trashede il pending. Ora sto usando una semplice query ma sta restituendo solo i post pubblicati.

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

Qualcuno può aiutare? Cos'altro devo fare?


4
Hai provato a utilizzare il post_statusparametro , ad es. 'post_status' => 'any'?
t31os,

2
Consiglio vivamente di usare WP_Query pre_get_postso get_postsinvece di query_posts. Non usare maiquery_posts
Tom J Nowell

@TomJNowell: era molto tempo fa :) Uso WP_Query più spesso ora ..
Sisir

1
@Sisir fai attenzione, usa WP_Queryper il front-end e get_postsper le domande di amministrazione in quanto c'è un problema con wp_reset_postdata(vedi la nota e il biglietto su questo problema).
Aurovrata,

Risposte:


65

È possibile utilizzare il parametro 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. 

Non sono sicuro che accetta "qualsiasi", quindi usa e array con tutti i tipi che desideri:

$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
È inoltre possibile utilizzare get_post_stati()per ottenere tutti gli stati, compresi quelli personalizzati.
fuxia

5
Un'occasione sprecata per terminare una query_postschiamata ...
Tom J Nowell

'post_status' => array( '!inherit' );peccato che non possiamo fare qualcosa del genere (per indicare qualsiasi post_status diverso da ereditare)
aequalsb

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

9

C'è un modo semplice, come ottenere tutti i post con qualsiasi stato:

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

Ora puoi scorrere tutti i post:

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

2
$ posts e $ post sono in conflitto con i nomi delle variabili di Wordpress . Se stai usando questo codice per inserire qualcosa di diverso dal div principale (contenuto principale), questo sovrascriverà ciò che sarebbe stato mostrato in principale. Se la tua intenzione è davvero quella di sostituire completamente i risultati della query originale, questo è ovviamente ciò che desideri. Ma è comunque una buona idea rinominare le variabili $ post e $ post.
Henrik Erlandsson,

5
@Henrik non intendo minimizzare affatto il tuo commento (la tua logica è solida e sicura), ma considero l'uso di $ post / $ posts come perfettamente accettabile all'interno di una funzione senza accesso alle variabili globali $ post / $ posts - perché mi aiuta a mantenere la logica durante lo sviluppo.
aequalsb,

6

Il WP_Querymetodo class ->query()accetta un anyargomento per post_status. Vederewp_get_associated_nav_menu_items() per una prova.

Lo stesso vale per get_posts()(che è solo un wrapper per la chiamata sopra).


3
Dai documenti WP_Query: "any": recupera qualsiasi stato tranne quelli dai tipi di post con "exclude_from_search" impostato su true. (C'è un errore di battitura lì, in realtà significano gli stati dei post anziché i tipi di post.) Ciò significa gli stati auto-drafte trashsono esclusi.
Tamlyn,

@Tamlyn Afaik, questo non è un errore di battitura. Si recupera qualsiasi stato da tipi di messaggi che sono disponibili al pubblico. Lo stato è solo termini. Non hanno proprietà pubbliche o private . È possibile disabilitare una tassonomia disabilitando il query_var... per qualsiasi motivo uno lo farebbe. Nota a margine: Il plurale di stato post è ... .
Kaiser

1
Se segui il codice (spesso più facile della lettura dei documenti, trovo) puoi vedere che WP_Query#get_posts()chiama get_post_stati()che filtra i $wp_post_statusesvalori dove exclude_from_searchè vero, quindi esclude i messaggi con questi stati dalla query. Esiste un processo simile per i tipi di post quando post_type è impostato su "any".
Tamlyn,

@Tamlyn Dopo aver verificato il contenuto della $wp_post_statusesproprietà, devo ammettere che hai ragione :)
kaiser

non funziona per lo stato del cestino.
Maxwell sc

2

Nella maggior parte dei casi è possibile utilizzare get_posts()con il 'any'parametro per questo:

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

Ma in questo modo non otterrai post con stato trashe auto-draft. Devi fornirli esplicitamente, in questo modo:

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

Oppure puoi usare la funzione get_post_stati () per fornire esplicitamente tutti gli stati esistenti:

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

1

Anche se passi anycome post_status, non otterrai comunque il post nel risultato se sono vere tutte le seguenti condizioni:

  1. È stato richiesto un singolo post. Un esempio di questo potrebbe essere l'interrogazione diname della lumaca.
  2. Il post ha uno stato post non pubblico.
  3. Il client non ha una sessione di amministrazione attiva, ovvero non si è attualmente connessi.

Soluzione

Interrogazione esplicita per ogni stato. Ad esempio, per cercare stati che non lo sono trasho auto-draft(è abbastanza improbabile che tu li voglia), potresti fare qualcosa del genere:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.