Как получить все записи с любым статусом публикации?

30 мар. 2011 г., 16:41:40
Просмотры: 209K
Голосов: 62

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

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

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

4
Комментарии

Пробовали ли вы использовать параметр post_status, например 'post_status' => 'any'?

t31os t31os
30 мар. 2011 г. 16:50:57

Я крайне рекомендую использовать WP_Query, pre_get_posts или get_posts вместо query_posts. Никогда не используйте query_posts.

Tom J Nowell Tom J Nowell
16 апр. 2013 г. 15:45:53

@TomJNowell: это было давно :) Сейчас я чаще всего использую WP_Query..

Sisir Sisir
17 апр. 2013 г. 20:22:07

@Sisir будь осторожен, используй WP_Query для фронтенда, а get_posts для админ-запросов, так как есть проблема с wp_reset_postdata (см. заметку и тикет по этой проблеме).

Aurovrata Aurovrata
30 янв. 2017 г. 10:10:19
Все ответы на вопрос 6
7
111

Вы можете использовать параметр post_status:

* 'publish' - опубликованная запись или страница
* 'pending' - запись ожидает проверки
* 'draft' - черновик записи
* 'auto-draft' - новая созданная запись без содержимого
* 'future' - запись для публикации в будущем
* 'private' - не видна пользователям без авторизации
* 'inherit' - ревизия. см. get_children.
* 'trash' - запись в корзине. Добавлено в версии 2.9.

Я не уверен, что поддерживается значение 'any', поэтому лучше использовать массив со всеми нужными статусами:

$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 мар. 2011 г. 17:20:50
Комментарии

Вы также можете использовать get_post_stati() для получения всех статусов, включая пользовательские.

fuxia fuxia
31 янв. 2013 г. 13:52:04

Упущенная возможность избавиться от вызова query_posts...

Tom J Nowell Tom J Nowell
16 апр. 2013 г. 15:45:09

жаль, что мы не можем сделать что-то вроде 'post_status' => array( '!inherit' ); (чтобы указать любой post_status, кроме inherit)

aequalsb aequalsb
3 янв. 2017 г. 03:17:26

@aequalsb а что насчёт 'post_status' => array_diff(get_post_stati(), ['inherit']);

Cheslab Cheslab
29 окт. 2018 г. 15:05:59

не по теме. 'any' — это действительно существующая опция. Документация: https://developer.wordpress.org/reference/classes/wp_query/#post-type-parameters

kirillrocks kirillrocks
20 янв. 2020 г. 16:26:58

Это неправильный ответ. any — это правильный ответ на вопрос Как получить все записи с любым статусом?

User User
23 мая 2022 г. 11:19:54

@user75665, ваше утверждение неверно. 'post_status'=>'any' не будет извлекать удаленные записи.

brett brett
17 апр. 2024 г. 16:37:44
Показать остальные 2 комментариев
4
24

Существует простой способ получить все записи с любым статусом:

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

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

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
31 янв. 2013 г. 11:55:21
Комментарии

Переменные $posts и $post конфликтуют с собственными именами переменных WordPress. Если вы используете этот код для размещения чего-либо в другом месте, кроме основного (главного контентного) div, это перезапишет то, что должно было отображаться в основном разделе. Если ваша цель действительно состоит в том, чтобы полностью заменить исходные результаты запроса, это именно то, что вам нужно, конечно. Но всё же рекомендуется переименовать переменные $posts и $post.

Henrik Erlandsson Henrik Erlandsson
3 февр. 2014 г. 09:54:50

@Henrik, я ни в коем случае не хочу принижать ваш комментарий (ваша логика верна и безопасна), но я считаю использование $post/$posts вполне допустимым внутри функции без доступа к глобальным переменным $post/$posts — потому что это помогает мне поддерживать логику во время разработки.

aequalsb aequalsb
3 янв. 2017 г. 03:14:57

ну... почти — просто попробуйте сравнить с ответом @bainternet, вы, вероятно, получите другое количество. Он не включает авто-черновики и удалённые записи.

Sagive Sagive
12 мая 2022 г. 13:16:26

Это правильный ответ на вопрос Как получить все записи с любым статусом публикации?. Использование any позволит вам получить записи с ЛЮБЫМ статусом публикации.

User User
23 мая 2022 г. 11:20:24
0

В большинстве случаев для этого можно использовать 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',
 )
);
28 авг. 2019 г. 21:32:09
5

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

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

5 окт. 2012 г. 14:02:06
Комментарии

Из документации WP_Query: 'any' - выбирает записи с любым статусом, кроме тех, у которых 'exclude_from_search' установлено в true. (Здесь опечатка, на самом деле имеются в виду статусы записей, а не типы записей.) Это означает, что статусы auto-draft и trash исключаются.

Tamlyn Tamlyn
15 апр. 2013 г. 15:50:16

@Tamlyn Насколько я знаю, это не опечатка. Это выбирает записи с любым статусом из типов записей, которые являются общедоступными. Статусы — это просто термины. У них нет свойств публичный или приватный. Вы могли бы отключить таксономию, отключив query_var... хотя сложно представить, зачем это делать. Примечание: Множественное число от post status....

kaiser kaiser
15 апр. 2013 г. 17:30:34

Если проследить код (часто это проще, чем читать документацию), можно увидеть, что WP_Query#get_posts() вызывает get_post_stati(), который фильтрует $wp_post_statuses для значений, где exclude_from_search равно true, а затем исключает записи с этими статусами из запроса. Аналогичный процесс происходит для типов записей, когда post_type установлен в 'any'.

Tamlyn Tamlyn
16 апр. 2013 г. 14:15:03

@Tamlyn После проверки содержимого свойства $wp_post_statuses должен признать, что вы правы :)

kaiser kaiser
16 апр. 2013 г. 15:07:27

не работает для статуса корзины.

Maxwell s.c Maxwell s.c
10 дек. 2018 г. 22:56:29
0

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

  1. Запрашивается один пост. Примером может быть запрос по name, то есть по слагу.
  2. Пост имеет статус, который не является публичным.

Решение

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

$q = new WP_Query([
    /* ... */
    'post_status' => array_values(get_post_stati(['exclude_from_search' => false])),
]);
28 мар. 2019 г. 02:04:21
1

Поскольку я пока не могу оставить комментарий: $args['post_status']='any'; работает для 'publish' и 'draft', но не для 'trash', мне потребовалось $args['post_status']=array('any','trash');

23 авг. 2021 г. 00:35:56
Комментарии

Добро пожаловать в WPSE! :)

Sisir Sisir
23 авг. 2021 г. 15:04:07