Come Ottenere Tutti i Post con Qualsiasi Stato?
Sto creando un pannello di controllo frontend dove devo mostrare tutti i post dell'utente corrente. Quindi, ho bisogno di visualizzare i post in tutti gli stati, principalmente published
, trashed
e pending
. Attualmente sto usando una query semplice ma restituisce solo i post pubblicati.
$query = array(
'post_type' => 'my-post-type',
'post_author' => $current_user->ID
);
query_posts($query);
Qualcuno può aiutarmi? Cos'altro devo fare?

Puoi usare il parametro post_status:
* 'publish' - un articolo o pagina pubblicata
* 'pending' - articolo in attesa di revisione
* 'draft' - un articolo in stato di bozza
* 'auto-draft' - un articolo appena creato, senza contenuto
* 'future' - un articolo programmato per pubblicazione futura
* 'private' - non visibile agli utenti non loggati
* 'inherit' - una revisione. vedi get_children.
* 'trash' - articolo nel cestino. aggiunto dalla Versione 2.9.
Non sono sicuro che accetti 'any' quindi usa un array con tutti gli stati che vuoi:
$args = array(
'post_type' => 'my-post-type',
'post_author' => $current_user->ID,
'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')
);
$query = new WP_Query($args);
while ( $query->have_posts() ) : $query->the_post();

Potresti anche usare get_post_stati()
per ottenere tutti gli stati, inclusi quelli personalizzati.

peccato non possiamo fare qualcosa come 'post_status' => array( '!inherit' );
(per indicare qualsiasi post_status diverso da inherit)

@aequalsb che ne dici di 'post_status' => array_diff(get_post_stati(), ['inherit']);

fuori tema. 'any' è effettivamente una cosa reale. Documentazione: https://developer.wordpress.org/reference/classes/wp_query/#post-type-parameters

Questa è la risposta sbagliata. any
è la risposta corretta alla domanda Come ottenere tutti i post con qualsiasi stato di pubblicazione?

Esiste un modo semplice per ottenere tutti i post con qualsiasi stato:
$articles = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'post_type' => get_post_types('', 'names'),
)
);
Ora puoi iterare attraverso tutti i post:
foreach ($articles as $article) {
echo $article->ID . PHP_EOL; //...
}

I nomi delle variabili $posts e $post entrano in conflitto con quelli usati da WordPress. Se stai usando questo codice per inserire qualcosa in un div diverso da quello principale (contenuto principale), questo sovrascriverà ciò che sarebbe stato mostrato nell'area principale. Se il tuo intento è effettivamente quello di sostituire completamente i risultati della query originale, allora è proprio ciò che vuoi, ovviamente. Ma è comunque una buona idea rinominare le variabili $posts e $post.

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

beh... quasi - prova a confrontarlo con la risposta di @bainternet, probabilmente otterrai un conteggio diverso. Non include gli auto-draft e quelli nel cestino.

Nella maggior parte dei casi puoi utilizzare get_posts()
con il parametro 'any'
in questo modo:
$posts = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'post_type' => 'my-post-type',
)
);
Ma in questo modo non otterrai i post con stato trash
e auto-draft
. Devi specificarli esplicitamente, così:
$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',
)
);

Il metodo WP_Query
->query()
accetta un argomento any
per post_status
. Vedi wp_get_associated_nav_menu_items()
per la dimostrazione.
Lo stesso vale per get_posts()
(che è semplicemente un wrapper per la chiamata sopra).

Dalle documentazioni di WP_Query: 'any' - recupera qualsiasi stato eccetto quelli dai tipi di post con 'exclude_from_search' impostato su true. (C'è un errore di battitura, in realtà si riferiscono agli stati dei post invece che ai tipi di post.) Questo significa che gli stati auto-draft
e trash
sono esclusi.

@Tamlyn Per quanto ne so, questo non è un errore di battitura. Recupera qualsiasi stato dai tipi di post che sono pubblicamente disponibili. Gli stati sono solo termini. Non hanno proprietà pubbliche o private di per sé. Potresti disabilitare una tassonomia disabilitando query_var
... per qualsiasi motivo uno volesse farlo. Nota a margine: Il plurale di post status è....

Se analizzi il codice (spesso più semplice che leggere la documentazione, trovo) puoi vedere che WP_Query#get_posts()
chiama get_post_stati()
che filtra $wp_post_statuses
per valori dove exclude_from_search
è true, poi esclude i post con questi stati dalla query. C'è un processo simile per i tipi di post quando post_type è impostato su 'any'.

@Tamlyn Dopo aver controllato il contenuto della proprietà $wp_post_statuses
, devo ammettere che hai ragione :)

Anche se passi any
come post_status
, non otterrai comunque il post nel risultato se tutte le seguenti condizioni sono vere:
- Viene interrogato un singolo post. Un esempio potrebbe essere l'interrogazione tramite
name
, cioè lo slug. - Il post ha uno stato che non è pubblico.
- Il client non ha una sessione amministrativa attiva, cioè non sei attualmente loggato.
Soluzione
Interroga esplicitamente per ogni stato. Ad esempio, per interrogare stati che non siano trash
o auto-draft
(è piuttosto improbabile che tu voglia questi), potresti fare qualcosa del genere:
$q = new WP_Query([
/* ... */
'post_status' => array_values(get_post_stati(['exclude_from_search' => false])),
]);
