В 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-заданий.