В WordPress статус поста (post_status) играет ключевую роль в управлении жизненным циклом записей, страниц, и других типов контента. Многие разработчики сталкиваются с задачей создания или изменения статусов постов для решения уникальных задач — например, добавления статусов вроде «На рассмотрении», «В архиве» или «Черновик с пометкой». В этой статье мы подробно разберём, как правильно использовать хук и фильтр post_status для расширения и управления статусами постов, а также приведём практические примеры с кодом для вашего сайта на WordPress.
Что такое post_status и зачем он нужен?
Статус поста — это системное поле, которое определяет текущее состояние записи. По умолчанию WordPress поддерживает несколько статусов:
- publish — опубликованная запись, видна всем;
- draft — черновик, доступен только автору;
- pending — ожидает проверки;
- private — приватная запись;
- trash — удалённая запись;
- future — запланированная публикация.
Иногда необходимо добавить свои, кастомные статусы. Например, в новостном портале может потребоваться статус «На модерации», а в каталоге — статус «Архив». Благодаря фильтрам и хукам WordPress можно легко расширить список статусов и управлять ими.
Добавление кастомного статуса поста в WordPress
Для создания нового статуса поста используйте функцию register_post_status. Она позволяет зарегистрировать статус с настройками, которые определяют его поведение в админке и на фронтенде.
Рассмотрим пример регистрации статуса wpreg_review — «На рассмотрении».
function wpreg_register_custom_post_status() {
register_post_status('wpreg_review', array(
'label' => _x('На рассмотрении', 'post'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('На рассмотрении <span class="count">(%s)</span>', 'На рассмотрении <span class="count">(%s)</span>'),
));
}
add_action('init', 'wpreg_register_custom_post_status');В коде выше мы прописали все параметры, чтобы статус корректно отображался в списках админки, в фильтрах и счётчиках.
Добавляем новый статус в выпадающий список редактирования
Чтобы в редакторе записей появился новый статус и его можно было выбрать, нужно добавить его в список статусов:
function wpreg_append_custom_status_to_post($post_statuses) {
global $post;
if($post->post_type === 'post') {
$post_statuses['wpreg_review'] = 'На рассмотрении';
}
return $post_statuses;
}
add_filter('display_post_states', 'wpreg_append_custom_status_to_post');Однако такой код не всегда добавляет статус в выпадающий список статусов в редакторе. Для этого нужно дополнительно использовать JavaScript или фильтр post_submitbox_misc_actions для вставки своего варианта.
Использование фильтра post_status для выборки записей по кастомному статусу
Очень часто требуется выводить записи с кастомным статусом в цикле WP_Query или в админке. Для этого можно использовать фильтр post_status в запросах.
Пример выборки записей со статусом wpreg_review:
$args = array(
'post_type' => 'post',
'post_status' => 'wpreg_review',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
if($query->have_posts()) {
while($query->have_posts()) {
$query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
}
wp_reset_postdata();
} else {
echo 'Нет записей на рассмотрении.';
}Добавление кастомного статуса в административные фильтры
Чтобы в списках записей в админке появился фильтр по новому статусу, добавим специальный код:
function wpreg_add_custom_status_filter() {
global $post_type;
if($post_type === 'post') {
$status = isset($_GET['post_status']) ? $_GET['post_status'] : '';
$selected = $status === 'wpreg_review' ? 'selected' : '';
echo '<select name="post_status" id="post_status">';
echo '<option value="">Все статусы</option>';
echo '<option value="wpreg_review" ' . $selected . '>На рассмотрении</option>';
echo '</select>';
}
}
add_action('restrict_manage_posts', 'wpreg_add_custom_status_filter');Этот код выведет дополнительный фильтр в админке, что позволит быстро отфильтровать записи по новому статусу.
Автоматическое изменение статуса поста через WPReg_cron
Для автоматизации смены статусов записей можно воспользоваться WPReg_cron — встроенным механизмом планировщика задач на вашем сайте WPReg.ru.
Например, меняем статус «На рассмотрении» на «publish» через 7 дней после создания записи:
function wpreg_auto_publish_reviewed_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'wpreg_review',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '7 days ago',
),
),
'posts_per_page' => -1,
);
$query = new WP_Query($args);
if($query->have_posts()) {
while($query->have_posts()) {
$query->the_post();
wp_update_post(array(
'ID' => get_the_ID(),
'post_status' => 'publish'
));
}
wp_reset_postdata();
}
}
add_action('wpreg_cron_daily_event', 'wpreg_auto_publish_reviewed_posts');Для работы этого кода необходимо зарегистрировать событие в WPReg_cron с интервалом в сутки. Это позволяет не нагружать сервер и своевременно обновлять статусы.
Использование плагинов для управления статусами постов
Если вы не хотите писать код, существуют плагины, которые упрощают работу с кастомными статусами:
- Post Status Manager — удобный интерфейс для создания и управления статусами.
- Clearfy Pro — содержит модуль для работы с пост-статусами и оптимизации.
Эти решения позволяют быстро внедрить новые статусы и интегрировать их в админку без глубоких знаний кода.
Резюме и рекомендации
Использование post_status — мощный инструмент для тонкой настройки поведения контента в WordPress. С помощью регистрации своих статусов, фильтров и хуков вы можете реализовать практически любые сценарии управления записями.
Рекомендуется:
- Всегда регистрировать кастомные статусы в
initдля корректной работы. - Добавлять статусы в фильтры админки для удобства пользователей.
- Использовать WPReg_cron для автоматизации смены статусов и других задач.
- При необходимости — использовать проверенные плагины из WPShop для ускорения разработки.
Такой подход позволит сделать систему управления контентом гибкой, удобной и соответствующей вашим бизнес-процессам.