В WordPress существует стандартный набор статусов публикаций: publish, draft, pending, private и несколько других. Однако иногда стандартных статусов недостаточно для сложных сценариев работы с контентом, и возникает необходимость добавить собственный, кастомный статус публикации (Custom Post Status). В этой статье подробно разберём, как создать, зарегистрировать и использовать кастомные статусы постов для решения конкретных задач.
Что такое Custom Post Status и зачем они нужны
Custom Post Status — это дополнительные статусы, которые можно добавить в WordPress для расширения логики публикации и управления контентом. Например, вы можете добавить статус «на рассмотрении», «в работе» или «требует правки». Это особенно полезно для сайтов с большим количеством редакторов или сложным workflow.
Использование кастомных статусов позволяет:
- Чётко разграничить этапы работы с публикацией;
- Автоматизировать процессы на сайте с помощью триггеров по статусам;
- Улучшить UX для авторов и редакторов;
- Настроить фильтрацию записей в админке по новым статусам.
Регистрация кастомного статуса в WordPress
Для регистрации нового статуса используется функция register_post_status(). Важно привязать её вызов к хуку init, чтобы статус был доступен при загрузке WordPress.
Пример регистрации статуса in_review — «На рассмотрении»:
add_action('init', 'wptavern_register_custom_post_status');
function wptavern_register_custom_post_status() {
register_post_status('in_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>'),
));
}
Разберём параметры:
label— название статуса для отображения в админке;public— делает статус видимым на фронтенде, если нужно;exclude_from_search— исключать ли из поиска;show_in_admin_all_list— показывать ли записи с этим статусом в списке «Все записи»;show_in_admin_status_list— показывать статус в фильтрах админки;label_count— шаблон для отображения количества записей с таким статусом.
Добавление кастомного статуса в выпадающий список статусов поста
После регистрации статуса нужно добавить его в метабокс редактирования записи, чтобы пользователь мог выбрать новый статус. Для этого используем JavaScript и PHP.
PHP-код для вставки статуса в список статусов:
add_action('admin_footer-post.php', 'wptavern_append_custom_post_status_js');
add_action('admin_footer-post-new.php', 'wptavern_append_custom_post_status_js');
function wptavern_append_custom_post_status_js() {
global $post;
if($post->post_type != 'post') return; // Можно заменить на свой тип
?>
<script>
jQuery(document).ready(function($){
// Добавляем статус в селектор
$('select#post_status').append('<option value="in_review" <?php selected($post->post_status, 'in_review'); ?>>На рассмотрении</option>');
// Если текущий статус равен кастомному, меняем отображение
if($('#post_status').val() == 'in_review') {
$('#post-status-display').text('На рассмотрении');
}
});
</script>
<?php
}
Этот код добавит пункт «На рассмотрении» в выпадающий список статусов при редактировании записи типа post. При необходимости замените тип записи на нужный.
Фильтрация записей по кастомным статусам в админке
Чтобы фильтр по новому статусу появился в списке записей, мы уже включили параметр show_in_admin_status_list при регистрации статуса. Добавим вывод ссылки с количеством записей с этим статусом с помощью хука views_edit-post:
add_filter('views_edit-post', 'wptavern_custom_post_status_views');
function wptavern_custom_post_status_views($views) {
$count = wp_count_posts()->in_review;
$class = (isset($_GET['post_status']) && $_GET['post_status'] === 'in_review') ? 'current' : '';
$url = admin_url('edit.php?post_status=in_review&post_type=post');
$views['in_review'] = "<a href='$url' class='$class'>На рассмотрении <span class='count'>($count)</span></a>";
return $views;
}
Теперь в верхней части списка записей появится вкладка «На рассмотрении» с количеством таких записей.
Использование кастомных статусов для автоматизации процессов
Кастомные статусы можно применять не только для визуального разграничения, но и для запуска автоматических действий. Например, можно отправлять уведомления редактору при переходе записи в статус «На рассмотрении» или автоматически менять статус после определённого времени.
Пример отправки уведомления при смене статуса:
add_action('transition_post_status', 'wptavern_notify_on_custom_status', 10, 3);
function wptavern_notify_on_custom_status($new_status, $old_status, $post) {
if ($new_status === 'in_review' && $old_status !== 'in_review' && $post->post_type === 'post') {
// Здесь можно отправить письмо редактору или выполнить другое действие
wp_mail('editor@example.com', 'Публикация на рассмотрении', 'Публикация "' . $post->post_title . '" теперь на рассмотрении.');
}
}
Такой подход позволяет реализовать полноценные workflow прямо в WordPress без сторонних сервисов.
Совместимость кастомных статусов с WPShop и дополнительными плагинами
Если вы используете плагины из WPShop, кастомные статусы прекрасно интегрируются с большинством из них. Например, в плагине Expert Review можно использовать кастомные статусы для управления этапами обзоров, а в Quizle — для управления состоянием викторин.
При работе с кастомными статусами важно проверять, поддерживает ли конкретный плагин расширение статусов или не конфликтует ли с ними.
Подведение итогов и рекомендации
Создание и использование кастомных статусов — мощный инструмент для кастомизации и оптимизации работы с контентом в WordPress. Вот основные советы:
- Всегда регистрируйте статусы на хуке
init; - Добавляйте статусы в выпадающие списки через JavaScript в админке;
- Используйте фильтры для отображения кастомных статусов в списках и фильтрах;
- Реализуйте автоматизацию на основе изменения статусов с помощью хука
transition_post_status; - Проверяйте совместимость с плагинами, особенно если используете WPShop продукты.
Так вы сможете гибко управлять контентом, улучшать процессы и делать работу редакторов удобнее.