Comment obtenir tous les messages avec n'importe quel statut?

38

Je crée un tableau de bord frontal où je dois afficher tous les messages de l'utilisateur actuel. Donc, je dois montrer des messages dans tous les états, principalement published, trashedet dans les pending. J'utilise maintenant une requête simple mais elle ne renvoie que les publications publiées.

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

Quelqu'un peut-il aider? Que dois-je faire d'autre?

Sisir
la source
4
Avez-vous essayé d'utiliser le post_statusparamètre , c'est à dire. 'post_status' => 'any'?
t31os
2
Je recommande fortement d' utiliser WP_Query pre_get_postsou get_postsau lieu de query_posts. Ne jamais utiliserquery_posts
Tom J Nowell
@TomJNowell: c'était il y a bien longtemps :) J'utilise WP_Query la plupart du temps maintenant.
Sisir
1
@Sisir soyez prudent, utilisez WP_Query-le get_postspour les requêtes front-end et pour les requêtes administratives en cas de problème wp_reset_postdata(reportez-vous à la note et au ticket relatifs à ce problème).
Aurovrata

Réponses:

65

Vous pouvez utiliser le paramètre 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. 

Je ne suis pas sûr qu'il accepte 'any', utilisez donc array avec tous les types souhaités:

$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
la source
7
Vous pouvez également utiliser get_post_stati()pour obtenir tous les statuts, y compris ceux personnalisés.
fuxia
5
Une occasion manquée de tuer un query_postsappel ...
Tom J Nowell
Dommage que nous ne puissions pas faire quelque chose comme ça 'post_status' => array( '!inherit' );(pour indiquer n'importe quel post-statut autre qu'hériter)
aequalsb
@aequalsb qu'en est-il'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab
9

Il existe un moyen simple, comment obtenir tous les messages avec n'importe quel statut:

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

Maintenant, vous pouvez parcourir tous les messages:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
OzzyCzech
la source
2
$ posts et $ post sont en conflit avec les propres noms de variables de Wordpress . Si vous utilisez ce code pour mettre autre chose que la div primaire (contenu principal), cela écrasera ce qui aurait été affiché dans main. Si votre intention est vraiment de remplacer complètement les résultats de la requête d'origine, c'est ce que vous voulez, bien sûr. Mais il est toujours judicieux de renommer les variables $ posts et $ post.
Henrik Erlandsson
5
@ Henrik, je n'ai pas l'intention de diminuer votre commentaire (votre logique est saine et sûre), mais je considère que l'utilisation de $ post / $ posts est parfaitement acceptable dans une fonction sans accès aux variables globales $ post / $ posts - car cela m'aide à maintenir la logique pendant le développement.
aequalsb
6

La WP_Queryméthode class ->query()accepte un anyargument pour post_status. Voir wp_get_associated_nav_menu_items()pour une preuve.

La même chose vaut pour get_posts()(qui est juste un wrapper pour l'appel ci-dessus).

kaiser
la source
3
Dans la documentation WP_Query: 'any' - récupère tous les statuts sauf ceux des types de publication avec 'exclude_from_search' défini sur true. (Il y a une faute de frappe ici, ils signifient en fait des statuts de publication au lieu de types de publication.) Cela signifie des statuts auto-draftet trashsont exclus.
Tamlyn
@Tamlyn Afaik, ce n'est pas une faute de frappe. Il récupère tout statut des types de publication disponibles publiquement. Le statut ne sont que des termes. Ils n'ont aucune propriété publique ou privée eux-mêmes. Vous pouvez désactiver une taxonomie en désactivant le query_var... pour quelque raison que ce soit. Sidenote: Le pluriel de l' état post est ... .
Kaiser
1
Si vous tracez dans le code (souvent plus facile que la lecture de la documentation, je trouve), vous pouvez voir que les WP_Query#get_posts()appels get_post_stati()filtrant les $wp_post_statusesvaleurs où exclude_from_searchtrue est vrai, alors les publications avec ces statuts sont exclues de la requête. Il existe un processus similaire pour les types de publication lorsque post_type est défini sur 'any'.
Tamlyn
@Tamlyn Après avoir vérifié le contenu de la $wp_post_statusespropriété, je dois admettre que vous avez raison :)
kaiser
ne fonctionne pas pour le statut de corbeille.
Maxwell sc
2

Dans la plupart des cas, vous pouvez utiliser get_posts()avec'any' paramètre pour cela:

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

Mais de cette façon, vous ne recevrez pas de messages avec le statut trashetauto-draft . Vous devez les fournir explicitement, comme ceci:

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

Ou vous pouvez utiliser la fonction get_post_stati () pour fournir explicitement tous les statuts existants:

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

Même si vous passez en anytant que post_status, vous n'obtiendrez toujours pas la publication du résultat si toutes les conditions suivantes sont remplies:

  1. Un seul post est interrogé. Un exemple de ceci serait interroger parname , c.-à-d. Le slug.
  2. La publication a un statut qui n'est pas public.
  3. Le client n'a pas de session d'administrateur active, c'est-à-dire que vous n'êtes pas actuellement connecté.

Solution

Interrogez explicitement pour chaque statut. Par exemple, pour rechercher des statistiques qui ne sont pas trashou auto-draft(il est peu probable que vous souhaitiez celles-ci), vous pouvez faire quelque chose comme ceci:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
XedinUnknown
la source