Как получить все записи с любым статусом публикации?
Я создаю панель управления на фронтенде, где мне нужно показать все записи текущего пользователя. Поэтому мне нужно отображать записи во всех состояниях, в основном 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() для получения всех статусов, включая пользовательские.
fuxia
жаль, что мы не можем сделать что-то вроде 'post_status' => array( '!inherit' ); (чтобы указать любой post_status, кроме inherit)
aequalsb
@aequalsb а что насчёт 'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab
не по теме. 'any' — это действительно существующая опция. Документация: https://developer.wordpress.org/reference/classes/wp_query/#post-type-parameters
kirillrocks
Это неправильный ответ. any — это правильный ответ на вопрос Как получить все записи с любым статусом?
User
Существует простой способ получить все записи с любым статусом:
$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 Erlandsson
@Henrik, я ни в коем случае не хочу принижать ваш комментарий (ваша логика верна и безопасна), но я считаю использование $post/$posts вполне допустимым внутри функции без доступа к глобальным переменным $post/$posts — потому что это помогает мне поддерживать логику во время разработки.
aequalsb
ну... почти — просто попробуйте сравнить с ответом @bainternet, вы, вероятно, получите другое количество. Он не включает авто-черновики и удалённые записи.
Sagive
В большинстве случаев для этого можно использовать 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
@Tamlyn Насколько я знаю, это не опечатка. Это выбирает записи с любым статусом из типов записей, которые являются общедоступными. Статусы — это просто термины. У них нет свойств публичный или приватный. Вы могли бы отключить таксономию, отключив query_var... хотя сложно представить, зачем это делать. Примечание: Множественное число от post status....
kaiser
Если проследить код (часто это проще, чем читать документацию), можно увидеть, что WP_Query#get_posts() вызывает get_post_stati(), который фильтрует $wp_post_statuses для значений, где exclude_from_search равно true, а затем исключает записи с этими статусами из запроса. Аналогичный процесс происходит для типов записей, когда post_type установлен в 'any'.
Tamlyn
@Tamlyn После проверки содержимого свойства $wp_post_statuses должен признать, что вы правы :)
kaiser
Даже если вы передадите any в качестве post_status, вы всё равно не получите пост в результатах, если выполняются все следующие условия:
- Запрашивается один пост. Примером может быть запрос по
name, то есть по слагу. - Пост имеет статус, который не является публичным.
Решение
Запрашивайте явно каждый статус. Например, чтобы запросить статусы, которые не являются trash или auto-draft (маловероятно, что они вам нужны), можно сделать так:
$q = new WP_Query([
/* ... */
'post_status' => array_values(get_post_stati(['exclude_from_search' => false])),
]);