Как получить все записи с любым статусом публикации?
Я создаю панель управления на фронтенде, где мне нужно показать все записи текущего пользователя. Поэтому мне нужно отображать записи во всех состояниях, в основном published
, trashed
и pending
. Сейчас я использую простой запрос, но он возвращает только опубликованные записи.
$query = array(
'post_type' => 'my-post-type',
'post_author' => $current_user->ID
);
query_posts($query);
Кто-нибудь может помочь? Что еще мне нужно сделать?

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

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

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

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

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

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

Существует простой способ получить все записи с любым статусом:
$articles = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'post_type' => get_post_types('', 'names'),
)
);
Теперь вы можете перебирать все записи:
foreach ($articles as $article) {
echo $article->ID . PHP_EOL; //...
}

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

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

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

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

Метод ->query()
класса WP_Query
принимает аргумент any
для параметра post_status
. Смотрите wp_get_associated_nav_menu_items()
для подтверждения.
То же самое относится и к функции get_posts()
(которая по сути является обёрткой для вышеуказанного вызова).

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

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

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

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

Даже если вы передадите any
в качестве post_status
, вы всё равно не получите пост в результатах, если выполняются все следующие условия:
- Запрашивается один пост. Примером может быть запрос по
name
, то есть по слагу. - Пост имеет статус, который не является публичным.
Решение
Запрашивайте явно каждый статус. Например, чтобы запросить статусы, которые не являются trash
или auto-draft
(маловероятно, что они вам нужны), можно сделать так:
$q = new WP_Query([
/* ... */
'post_status' => array_values(get_post_stati(['exclude_from_search' => false])),
]);
