Как получить все сообщения с любым статусом сообщения?

38

Я создаю интерфейсную панель, где мне нужно показать все сообщения текущего пользователя. Итак, мне нужно показывать посты во всех штатах, в основном published, trashedи pending. Сейчас я использую простой запрос, но он возвращает только опубликованные сообщения.

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

Кто-нибудь может помочь? Что еще мне нужно сделать?

Sisir
источник
4
Вы пробовали использовать post_statusпараметр , т.е. 'post_status' => 'any'?
t31os
2
Я настоятельно рекомендую использовать WP_Query pre_get_postsили get_postsвместо query_posts. Никогда не используйтеquery_posts
Tom J Nowell
@TomJNowell: это было давно :) Я использую WP_Query чаще всего сейчас ..
Сисир
1
@Sisir, будьте осторожны, используйте его как WP_Queryдля внешнего интерфейса, так и get_postsдля запросов администратора, так как есть проблема с wp_reset_postdata(см. Примечание и тикет по этому вопросу).
Ауроврата

Ответы:

65

Вы можете использовать параметр 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. 

Я не уверен, что он принимает 'any', поэтому используйте и массив со всеми типами, которые вы хотите:

$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
источник
7
Вы также можете использовать get_post_stati()для получения всех статусов, в том числе пользовательских.
fuxia
5
Потраченная впустую возможность убить query_postsвызов ...
Том Дж. Новелл
'post_status' => array( '!inherit' );Жаль, что мы не можем сделать что-то подобное (чтобы указать любой post_status, кроме наследовать)
aequalsb
@aequalsb как насчет'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab
9

Есть простой способ, как получить все сообщения с любым статусом:

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

Теперь вы можете перебирать все сообщения:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
OzzyCzech
источник
2
$ posts и $ post конфликтуют с именами собственных переменных Wordpress . Если вы используете этот код для помещения чего-то другого, кроме основного (основного содержимого) div, это перезапишет то, что было бы показано в main. Если вы действительно хотите полностью заменить исходные результаты запроса, это, конечно, то, что вы хотите. Но все же хорошая идея переименовать переменные $ posts и $ post.
Хенрик Эрландссон
5
@Henrik Я вовсе не собираюсь уменьшать ваш комментарий (ваша логика разумна и безопасна), но я считаю, что использование $ post / $ posts вполне допустимо внутри функции без доступа к глобальным переменным $ post / $ posts - потому что это помогает мне поддерживать логику во время разработки.
Aequalsb
6

Метод WP_Queryкласса ->query()принимает anyаргумент для post_status. Смотрите wp_get_associated_nav_menu_items()для доказательства.

То же самое касается get_posts()(который является просто оберткой для вышеупомянутого вызова).

кайзер
источник
3
Из документов WP_Query: «любой» - извлекает любой статус, кроме тех, которые относятся к типам записей, для которых «exclude_from_search» имеет значение true. (Там есть опечатка, они фактически означают статусы сообщений вместо типов сообщений.) Это означает статусы auto-draftи trashисключаются.
Тамлин
@Tamlyn Afaik, это не опечатка. Он извлекает любой статус из общедоступных типов сообщений . Статус - это просто условия. У них нет никакой общественной или частной собственности. Вы можете отключить таксономию с отключением query_var... по любой причине, по которой можно это сделать. Sidenote: Множественный пост статуса является ... .
Кайзер
1
Если вы прослеживаете код (часто проще, чем чтение документов, я обнаружил), вы можете увидеть, что WP_Query#get_posts()вызовы, get_post_stati()которые фильтруют $wp_post_statusesзначения, где exclude_from_searchtrue, тогда исключают сообщения с этими статусами из запроса. Аналогичный процесс для типов записей, когда для post_type установлено значение «any».
Тамлин
@Tamlyn После проверки содержимого $wp_post_statusesобъекта, я должен признать, что вы правы :)
kaiser
не работает для состояния корзины.
Максвелл sc
2

В большинстве случаев вы можете использовать get_posts()с 'any'параметром для этого:

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

Но таким образом вы не будете получать сообщения со статусом trashи auto-draft. Вы должны предоставить их явно, как это:

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

Или вы можете использовать функцию get_post_stati () для явного предоставления всех существующих статусов:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => get_post_stati(),
  'post_type' => 'my-post-type',
 )
);
Сергей Захарченко
источник
1

Даже если вы пройдете anyкак post_status, вы все равно не получите сообщение в результате, если выполняются все следующие условия:

  1. Один пост запрашивается. Примером этого может быть запрос name, то есть слизняк.
  2. Сообщение имеет статус сообщения, которое не является общедоступным.
  3. У клиента нет активного сеанса администратора, т.е. вы не вошли в систему.

Решение

Запрос явно для каждого статуса. Например, чтобы запросить stati, которые не являются trashили auto-draft(маловероятно, что вы хотите их), вы можете сделать что-то вроде этого:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
XedinUnknown
источник