Wie bekomme ich alle Beiträge mit einem Beitragsstatus?

38

Ich erstelle ein Front-End-Dashboard, in dem ich alle Beiträge des aktuellen Benutzers anzeigen muss. Also, ich brauche Beiträge in allen Staaten zu zeigen, vor allem published, trashedund das pending. Ich verwende jetzt eine einfache Abfrage, die jedoch nur die veröffentlichten Beiträge zurückgibt.

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

Kann jemand helfen? Was muss ich sonst noch tun?

Sisir
quelle
4
Haben Sie versucht, den post_statusParameter zu verwenden , dh. 'post_status' => 'any'?
30.
2
Ich empfehle dringend die Verwendung von WP_Query pre_get_postsoder get_postsanstelle von query_posts. Niemals benutzenquery_posts
Tom J Nowell
@ TomJNowell: das war schon lange zurück :) Ich benutze WP_Query meistens jetzt ..
Sisir
1
@Sisir seien Sie vorsichtig, verwenden Sie es WP_Queryfür Front-End- und get_postsAdministratoranfragen, da es ein Problem mit gibt wp_reset_postdata(siehe Hinweis und Ticket zu diesem Problem).
Aurovrata

Antworten:

65

Sie können den Parameter post_status verwenden:

* '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. 

Ich bin nicht sicher, ob es "any" akzeptiert, also benutze und ordne es mit allen Typen, die du willst:

$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
quelle
7
Sie können auch verwenden get_post_stati(), um alle Status abzurufen, auch benutzerdefinierte.
Fuxia
5
Eine verpasste Gelegenheit, einen query_postsAnruf
abzubrechen
schade, dass wir so etwas nicht machen können 'post_status' => array( '!inherit' );(um einen anderen post_status als "inherit"
anzugeben
@aequalsb was ist mit'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab
9

Es gibt eine einfache Möglichkeit, wie Sie alle Posts mit einem beliebigen Status abrufen können:

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

Jetzt können Sie alle Posts durchlaufen:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
OzzyCzech
quelle
2
$ posts und $ post stehen im Konflikt mit Wordpress-eigenen Variablennamen . Wenn Sie diesen Code verwenden, um etwas anderes als das primäre div (Hauptinhalt) einzufügen, wird das überschrieben, was in main angezeigt worden wäre. Wenn Sie die ursprünglichen Abfrageergebnisse wirklich vollständig ersetzen möchten, ist dies natürlich Ihre Absicht. Es ist jedoch immer noch eine gute Idee, die Variablen "$ posts" und "$ post" umzubenennen.
Henrik Erlandsson
5
@ Henrik Ich habe nicht die Absicht, Ihren Kommentar zu verringern (Ihre Logik ist solide und sicher), aber ich halte die Verwendung von $ post / $ posts innerhalb einer Funktion ohne Zugriff auf die globalen Variablen $ post / $ posts für vollkommen akzeptabel - weil Es hilft mir, die Logik während der Entwicklung aufrechtzuerhalten.
Aequalsb
6

Die WP_QueryKlassenmethode ->query()akzeptiert ein anyArgument für post_status. Siehe wp_get_associated_nav_menu_items()für einen Beweis.

Das gleiche gilt für get_posts()(was nur ein Wrapper für den obigen Aufruf ist).

Kaiser
quelle
3
In den WP_Query-Dokumenten: 'any' - Ruft einen beliebigen Status ab, außer den von Beitragstypen, bei denen 'exclude_from_search' auf true gesetzt ist. (Es gibt einen Tippfehler, sie bedeuten tatsächlich Poststatus anstelle von Posttypen.) Dies bedeutet Status auto-draftund trashwird ausgeschlossen.
Tamlyn
@ Tamlyn Afaik, das ist kein Tippfehler. Es ruft jeden Status von Beitragstypen ab , die öffentlich verfügbar sind. Status sind nur Begriffe. Sie haben selbst kein öffentliches oder privates Eigentum. Sie können eine Taxonomie deaktivieren, indem Sie query_var... aus welchem ​​Grund auch immer deaktivieren . Nebenbei bemerkt: Der Plural von Post - Status ist ... .
Kaiser
1
Wenn Sie den Code nachverfolgen (der oft einfacher ist als das Lesen der Dokumente, finde ich), können Sie feststellen, dass WP_Query#get_posts()Aufrufe, get_post_stati()die $wp_post_statusesnach Werten filtern, wo exclude_from_searchwahr ist, Beiträge mit diesen Status von der Abfrage ausschließen. Es gibt einen ähnlichen Prozess für Beitragstypen, wenn post_type auf "any" gesetzt ist.
Tamlyn
@ Tamlyn Nachdem $wp_post_statusesich den Inhalt der Unterkunft überprüft habe , muss ich zugeben, dass Sie Recht haben :)
Kaiser
funktioniert nicht für den Papierkorbstatus.
Maxwell sc
2

In den meisten Fällen können Sie get_posts()mit 'any'Parameter dafür verwenden:

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

Auf diese Weise erhalten Sie jedoch keine Posts mit dem Status trashund auto-draft. Sie müssen sie explizit wie folgt bereitstellen:

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

Oder Sie können die Funktion get_post_stati () verwenden, um alle vorhandenen Status explizit anzugeben:

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

Selbst wenn Sie anyals übergeben post_status, erhalten Sie den Beitrag im Ergebnis nicht, wenn alle folgenden Bedingungen erfüllt sind:

  1. Ein einzelner Beitrag wird abgefragt. Ein Beispiel hierfür wäre die Abfrage durch name, dh die Schnecke.
  2. Der Beitrag hat einen nicht öffentlichen Beitragsstatus.
  3. Der Client hat keine aktive Administrationssitzung, dh Sie sind derzeit nicht angemeldet.

Lösung

Abfrage explizit für jeden Status. Um beispielsweise nach Stati zu fragen, die nicht trashoder auto-draft(es ist ziemlich unwahrscheinlich, dass Sie diese möchten), können Sie Folgendes tun:

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