Как использовать хук и фильтр post_status в WordPress для управления статусами записей

В 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 для ускорения разработки.

Такой подход позволит сделать систему управления контентом гибкой, удобной и соответствующей вашим бизнес-процессам.

Как использовать WooCommerce хуки для настройки процесса оформления заказа
22.04.2026
Как использовать хук и фильтр post_status в WordPress для управления статусами записей
05.03.2026
Как удалить зависшие задачи в WP-Cron WordPress
19.03.2026
Автоматическое удаление оставшихся частей кода в WordPress после деактивации плагинов
20.11.2025
Как удалить скрипты и стили WordPress для ускорения сайта
16.12.2025