Cum să obții toate articolele cu orice status?
Creez un panou de control frontend unde trebuie să afișez toate articolele utilizatorului curent. Astfel, am nevoie să afișez articolele în toate stările, în principal published
, trashed
și pending
. Momentan folosesc o interogare simplă dar aceasta îmi returnează doar articolele publicate.
$query = array(
'post_type' => 'my-post-type',
'post_author' => $current_user->ID
);
query_posts($query);
Mă poate ajuta cineva? Ce altceva trebuie să fac?

Puteți utiliza parametrul post_status:
* 'publish' - un articol sau pagină publicată
* 'pending' - articol în așteptarea moderării
* 'draft' - articol în stadiu de ciornă
* 'auto-draft' - articol nou creat, fără conținut
* 'future' - articol programat pentru publicare în viitor
* 'private' - vizibil doar pentru utilizatorii autentificați
* 'inherit' - o revizie. vezi get_children.
* 'trash' - articol în coșul de gunoi. adăugat începând cu Versiunea 2.9.
Nu sunt sigur că acceptă 'any', așa că folosiți un array cu toate statusurile dorite:
$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();

De asemenea, poți folosi get_post_stati()
pentru a obține toate statusurile, inclusiv cele personalizate.

păcat că nu putem face ceva de genul 'post_status' => array( '!inherit' );
(pentru a indica orice post_status în afară de inherit)

@aequalsb ce zici de 'post_status' => array_diff(get_post_stati(), ['inherit']);

off-topic. 'any' este de fapt o opțiune reală. Documentație: https://developer.wordpress.org/reference/classes/wp_query/#post-type-parameters

Acesta este răspunsul greșit. any
este răspunsul corect la întrebarea Cum să obții toate articolele cu orice status de postare?

Există o metodă simplă de a obține toate articolele, indiferent de statusul lor:
$articles = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'post_type' => get_post_types('', 'names'),
)
);
Acum poți parcurge toate articolele:
foreach ($articles as $article) {
echo $article->ID . PHP_EOL; //...
}

Variabilele $posts și $post intră în conflict cu numele de variabile proprii ale WordPress. Dacă folosești acest cod pentru a afișa ceva în alt div decât cel principal (conținutul principal), acesta va suprascrie ceea ce ar fi trebuit afișat în zona principală. Dacă intenția ta este într-adevăr să înlocuiești complet rezultatele originale ale interogării, atunci asta e ceea ce vrei, desigur. Dar totuși, este o idee bună să redenumești variabilele $posts și $post.

@Henrik nu intenționez să diminuez comentariul tău deloc (logica ta este solidă și sigură), dar consider că utilizarea variabilelor $post/$posts este perfect acceptabilă în interiorul unei funcții fără acces la variabilele globale $post/$posts - deoarece mă ajută să mențin logica în timpul dezvoltării.

ei bine.. aproape - doar încearcă soluția ta versus răspunsul lui @bainternet, probabil vei obține un număr diferit. nu include stările auto-draft (schiță automată) și trashed (șters).

În majoritatea cazurilor, poți folosi get_posts()
cu parametrul 'any'
pentru asta:
$posts = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'post_type' => 'my-post-type',
)
);
Dar în acest fel nu vei obține postările cu statusurile trash
și auto-draft
. Trebuie să le specifici explicit, astfel:
$posts = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any, trash, auto-draft',
'post_type' => 'my-post-type',
)
);
Sau poți folosi funcția get_post_stati() pentru a specifica toate statusurile existente explicit:
$posts = get_posts(
array(
'numberposts' => -1,
'post_status' => get_post_stati(),
'post_type' => 'my-post-type',
)
);

Metoda clasei WP_Query
->query()
acceptă un argument any
pentru post_status
. Consultați wp_get_associated_nav_menu_items()
pentru o dovadă.
Același lucru este valabil și pentru get_posts()
(care este doar un wrapper pentru apelul menționat mai sus).

Din documentația WP_Query: 'any' - preia orice status, cu excepția celor din tipurile de postări care au 'exclude_from_search' setat pe true. (Există o greșeală de tipar acolo, ei se referă de fapt la statusurile postărilor în loc de tipurile de postări.) Aceasta înseamnă că statusurile auto-draft
și trash
sunt excluse.

@Tamlyn Din câte știu eu, aceasta nu este o greșeală de tipar. Acesta preia orice status din tipurile de postări care sunt disponibile public. Statusurile sunt doar termeni. Ele nu au o proprietate publică sau privată în sine. Ai putea dezactiva o taxonomie prin dezactivarea query_var
... din orice motiv ai face asta. Notă laterală: Pluralul pentru post status este....

Dacă urmărești codul (adesea mai ușor decât să citești documentația, cred) poți vedea că WP_Query#get_posts()
apelează get_post_stati()
care filtrează $wp_post_statuses
pentru valori unde exclude_from_search
este true, apoi exclude postările cu aceste statusuri din interogare. Există un proces similar pentru tipurile de postări când post_type este setat pe 'any'.

@Tamlyn După ce am verificat conținutul proprietății $wp_post_statuses
, trebuie să recunosc că ai dreptate :)

Chiar dacă treci any
ca post_status
, tot nu vei obține postarea în rezultat dacă toate următoarele condiții sunt adevărate:
- Se interoghează o singură postare. Un exemplu ar fi interogarea după
name
, adică slug-ul. - Postarea are un status care nu este public.
- Clientul nu are o sesiune de administrare activă, adică nu ești autentificat în prezent.
Soluție
Interoghează explicit pentru fiecare status. De exemplu, pentru a interoga statuturile care nu sunt trash
sau auto-draft
(este puțin probabil să dorești acestea), ai putea face ceva de genul:
$q = new WP_Query([
/* ... */
'post_status' => array_values(get_post_stati(['exclude_from_search' => false])),
]);
