Come Ottenere Tutti i Post con Qualsiasi Stato?

30 mar 2011, 16:41:40
Visualizzazioni: 209K
Voti: 62

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?

4
Commenti

Hai provato a usare il parametro post_status, ad esempio 'post_status' => 'any'?

t31os t31os
30 mar 2011 16:50:57

Consiglio vivamente di utilizzare WP_Query, pre_get_posts o get_posts invece di query_posts. Non usare mai query_posts

Tom J Nowell Tom J Nowell
16 apr 2013 15:45:53

@TomJNowell: quello era tempo fa :) Ora uso principalmente WP_Query..

Sisir Sisir
17 apr 2013 20:22:07

@Sisir fai attenzione, usa WP_Query per il front-end e get_posts per le query in admin poiché c'è un problema con wp_reset_postdata (vedi la nota e il ticket su questo problema).

Aurovrata Aurovrata
30 gen 2017 10:10:19
Tutte le risposte alla domanda 6
7
111

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();
30 mar 2011 17:20:50
Commenti

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

fuxia fuxia
31 gen 2013 13:52:04

Un'occasione sprecata per eliminare una chiamata query_posts...

Tom J Nowell Tom J Nowell
16 apr 2013 15:45:09

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

aequalsb aequalsb
3 gen 2017 03:17:26

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

Cheslab Cheslab
29 ott 2018 15:05:59

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

kirillrocks kirillrocks
20 gen 2020 16:26:58

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

User User
23 mag 2022 11:19:54

@user75665, la tua affermazione è falsa. 'post_status'=>'any' non recupererà i post cestinati.

brett brett
17 apr 2024 16:37:44
Mostra i restanti 2 commenti
4
24

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; //...
}
31 gen 2013 11:55:21
Commenti

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 Erlandsson Henrik Erlandsson
3 feb 2014 09:54:50

@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.

aequalsb aequalsb
3 gen 2017 03:14:57

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

Sagive Sagive
12 mag 2022 13:16:26

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

User User
23 mag 2022 11:20:24
0

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',
 )
);
28 ago 2019 21:32:09
5

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).

5 ott 2012 14:02:06
Commenti

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 Tamlyn
15 apr 2013 15:50:16

@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 è....

kaiser kaiser
15 apr 2013 17:30:34

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 Tamlyn
16 apr 2013 14:15:03

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

kaiser kaiser
16 apr 2013 15:07:27

non funziona per lo stato di cestino.

Maxwell s.c Maxwell s.c
10 dic 2018 22:56:29
0

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

  1. Viene interrogato un singolo post. Un esempio potrebbe essere l'interrogazione tramite name, cioè lo slug.
  2. Il post ha uno stato che non è pubblico.
  3. 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])),
]);
28 mar 2019 02:04:21
1

Dal momento che non posso ancora commentare: $args['post_status']='any'; funziona per 'publish' e 'draft', ma non per 'trash', ho avuto bisogno di $args['post_status']=array('any','trash');

23 ago 2021 00:35:56
Commenti

Benvenuto su WPSE! :)

Sisir Sisir
23 ago 2021 15:04:07