Как создать и использовать нестандартные статусы записей в WordPress

В WordPress по умолчанию есть несколько статусов записей: publish, draft, pending, private и некоторые другие. Но что делать, если вам нужно добавить свои, например, на рассмотрении, в работе или аренда для кастомных типов записей? Это полезно для настройки бизнес-процессов и удобного управления контентом.

Зачем нужны кастомные статусы записей в WordPress

Использование нестандартных статусов позволяет:

  • Разграничить этапы публикации и обработки контента.
  • Автоматизировать управление записями в административной части.
  • Создавать сложные рабочие процессы, например, для магазина, каталога или портала.
  • Фильтровать записи по новым статусам в админке и на фронтенде.

Стандартные статусы часто не покрывают все бизнес-требования, и добавление своих — естественный шаг для разработчика.

Как зарегистрировать новый статус записи в WordPress

Регистрация собственного статуса происходит через хук init и функцию register_post_status(). Рассмотрим на примере статуса wpquery_review со словом «На рассмотрении».

add_action('init', 'wpquery_register_custom_post_status');
function wpquery_register_custom_post_status() {
    register_post_status('wpquery_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>'),
    ));
}

Обратите внимание на параметры:

  • public — позволяет статусу быть видимым на сайте.
  • show_in_admin_all_list и show_in_admin_status_list — отображение в списках записей.
  • label_count — вывод количества записей с этим статусом.

Добавление нового статуса в выпадающий список статусов публикации

После регистрации статуса он не появится в редакторе записи, пока вы явно не добавите его в список. Для этого используем JavaScript в админке и PHP фильтр display_post_states.

Добавление в выпадающий список в редакторе Gutenberg и классическом редакторе

Добавим через хук admin_footer-post.php и admin_footer-post-new.php скрипт, который расширит выпадающий список:

add_action('admin_footer-post.php', 'wpquery_append_custom_post_status_js');
add_action('admin_footer-post-new.php', 'wpquery_append_custom_post_status_js');
function wpquery_append_custom_post_status_js() {
    global $post;
    if ($post->post_type != 'post') return; // Можно заменить на свой CPT
    ?>
    <script>
    jQuery(document).ready(function($){
        var status = 'wpquery_review';
        if ($('#post-status-display').length && $('select#post_status option[value="' + status + '"]').length === 0) {
            $('select#post_status').append('<option value="' + status + '">На рассмотрении</option>');
        }
        if ($('#post-status-display').text().indexOf('На рассмотрении') !== -1) {
            $('select#post_status').val(status);
        }
    });
    </script>
    <?php
}

Отображение статуса на странице списка записей

Чтобы рядом с названием записи выводился наш статус, добавим фильтр:

add_filter('display_post_states', 'wpquery_display_custom_post_status_state');
function wpquery_display_custom_post_status_state($states) {
    global $post;
    if ($post->post_status === 'wpquery_review') {
        return array('На рассмотрении');
    }
    return $states;
}

Фильтрация записей по кастомному статусу и вывод на сайте

Чтобы выводить записи с новым статусом на страницах сайта, нужно расширить запрос WP_Query. По умолчанию WordPress не показывает нестандартные статусы на фронтенде.

Добавление поддержки в WP_Query

Для примера выведем все записи с нашим статусом на отдельной странице (можно через shortcode или шаблон):

$args = array(
    'post_type'   => 'post',
    'post_status' => 'wpquery_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>';
        the_excerpt();
    }
    wp_reset_postdata();
} else {
    echo '<p>Записей с таким статусом нет.</p>';
}

Поддержка в REST API

Если вы используете REST API, то по умолчанию ваши кастомные статусы не доступны. Добавим их поддержку:

add_filter('rest_post_collection_params', 'wpquery_add_custom_status_to_rest');
function wpquery_add_custom_status_to_rest($params) {
    if (!empty($params['status'])) {
        $params['status']['enum'][] = 'wpquery_review';
    }
    return $params;
}

Применение: пример на кастомном типе записей «заказы»

Предположим, у вас есть CPT order, и вы хотите добавить статусы в_обработке, отгружен и отменен. Вот базовый код регистрации:

add_action('init', 'wpquery_register_order_statuses');
function wpquery_register_order_statuses() {
    register_post_status('in_process', array(
        'label'                     => 'В обработке',
        'public'                    => true,
        '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>'),
    ));
    register_post_status('shipped', array(
        'label'                     => 'Отгружен',
        'public'                    => true,
        '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>'),
    ));
    register_post_status('cancelled', array(
        'label'                     => 'Отменен',
        'public'                    => 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>'),
    ));
}

И аналогично добавьте их в селекторы и фильтры, чтобы удобно управлять заказами в админке.

Рекомендации и полезные плагины для работы с кастомными статусами

Если хотите упростить работу с нестандартными статусами, можно использовать плагины:

  • Admin Columns — расширяет таблицы в админке, позволяет фильтровать по статусам.
  • Clearfy Pro — оптимизация и кастомизация, есть инструменты для работы с кастомными статусами.
  • WPRemark — если статус связан с комментариями или отзывами, тут есть полезные инструменты.

Также можно автоматизировать смену статуса по событию с помощью хуков transition_post_status и cron-заданий.

Как избежать проблемы с хранением данных в WordPress: практические советы
14.02.2026
Как создать динамические таблицы в WordPress с использованием шорткода и AJAX
05.02.2026
Автоматический импорт данных из Excel в WordPress: пошаговое руководство
21.01.2026
Как создать свой плагин для автоматизации задач в WordPress
30.01.2026
WooCommerce: как автоматически очищать корзину после отмены заказа
21.05.2026