WordPress по умолчанию использует стандартные статусы записей: publish, draft, pending и несколько других. Однако в ряде проектов возникает необходимость создавать собственные статусы (post status) для удобного управления жизненным циклом контента. В этой статье мы подробно рассмотрим, как добавить, зарегистрировать и использовать собственные статусы записей, а также как отображать их в админке и фильтровать по ним записи.
Что такое post status в WordPress и зачем создавать свои
Post status — это параметр, который определяет текущее состояние записи (поста, страницы, custom post type) в WordPress. Помимо стандартных статусов, например, publish (опубликовано) или draft (черновик), можно создавать новые, например, review (на проверке), archived (архивный), expired (истёкший) и т.д.
Зачем это нужно? Например, если у вас сайт с новостями, вы можете добавить статус needs_editing для статей, которые требуют доработки. Или для кастомного типа записей «Отзыв» можно добавить статус approved или rejected. Это позволит более гибко управлять контентом и автоматизировать процессы.
Создание и использование собственного post status открывает новые возможности для бизнес-логики и контроля контента без дополнительных плагинов.
Регистрация собственного post status в WordPress
Для добавления собственного статуса используется функция register_post_status. Обычно это делают в файле functions.php вашей темы или в плагине.
Пример регистрации статуса wp_tests_review с названием «На проверке»:
function wptests_register_post_status() {
register_post_status('wp_tests_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', 'wptests_register_post_status');Пояснения к параметрам:
label— название статуса в админке;public— делает статус публичным, т.е. записи с ним доступны на фронтенде;exclude_from_search— исключать ли из поиска на сайте;show_in_admin_all_list— показывать ли в общем списке записей;show_in_admin_status_list— показывать ли в фильтре статусов на странице всех записей;label_count— формат вывода количества записей с этим статусом.
Отображение собственного статуса в списке записей и фильтрах
После регистрации статуса нужно добавить его отображение в интерфейс админки, чтобы редакторы видели и могли фильтровать записи по новому статусу.
Добавление статуса в выпадающий список при редактировании записи
Для этого применим JavaScript, который добавит наш статус в селектор статусов:
function wptests_append_post_status_list(){
global $post;
$complete = '';
$label = '';
if ($post->post_status == 'wp_tests_review') {
$complete = ' selected="selected"';
$label = '<span id="post-status-display"> На проверке</span>';
}
?>
<script>
jQuery(document).ready(function($){
$("select#post_status").append('<option value="wp_tests_review"' + '<?php echo $complete; ?>' + '>На проверке</option>');
$(".misc-pub-section label").append('<?php echo $label; ?>');
});
</script>
<?php
}
add_action('post_submitbox_misc_actions', 'wptests_append_post_status_list');Добавление фильтра по новому статусу на странице со списком записей
Чтобы добавить пункт фильтра в админ-панель, используем хук restrict_manage_posts:
function wptests_add_status_filter() {
global $typenow;
if ($typenow != 'post') return; // ограничение только для постов
$status = isset($_GET['post_status']) ? $_GET['post_status'] : '';
?>
<select name="post_status" id="post_status">
<option value="" <?php selected($status, ''); ?>>Все статусы</option>
<option value="wp_tests_review" <?php selected($status, 'wp_tests_review'); ?>>На проверке</option>
</select>
<?php
}
add_action('restrict_manage_posts', 'wptests_add_status_filter');Примеры практического применения post status
Рассмотрим несколько сценариев, где собственный статус очень полезен.
1. Автоматизация публикации статей после проверки
Можно создать статус wp_tests_review для статей, которые должны пройти проверку редактором. После одобрения статус меняется на publish.
Пример кода для автоматической смены статуса по событию:
function wptests_approve_post($post_id) {
$post = get_post($post_id);
if ($post->post_status === 'wp_tests_review') {
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'publish'
));
}
}
// Можно привязать к кастомному AJAX-запросу или кнопке в админке2. Использование post status для кастомных типов записей
Если у вас есть кастомный тип записей, например, «Отзывы», можно добавить статусы approved, rejected и pending_review для удобного контроля модерации.
Пример регистрации статуса для кастомных отзывов:
register_post_status('wptests_approved', array(
'label' => _x('Одобрен', 'post'),
'public' => true,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
));3. Интеграция с плагинами и расширениями
Например, плагин WPRemark для отзывов может использовать собственные статусы для фильтрации отзывов по состоянию модерации.
Вы можете настроить совместимость своего кастомного статуса с WPRemark или другими плагинами, чтобы расширить функционал.
Особенности и рекомендации при работе с post status
При работе с собственными статусами важно помнить несколько моментов:
- Обязательно регистрируйте статус на хук
init, чтобы WordPress его корректно распознал. - Если статус публичный, записи с ним будут доступны на сайте, поэтому позаботьтесь о логике отображения.
- Добавляйте поддержку в админку — иначе редакторы могут не видеть или не выбирать ваш статус.
- Для комплексных решений используйте фильтры и хуки WordPress, чтобы автоматизировать смену статусов и интеграцию с другими системами.
Заключение
Post status — мощный инструмент для управления контентом в WordPress. Создавая собственные статусы, вы получаете гибкость и контроль над жизненным циклом записей, что особенно важно для крупных проектов и сайтов с нестандартной логикой.
Для расширения функционала рекомендую ознакомиться с плагином Clearfy Pro, который помогает управлять оптимизацией и безопасностью, а также может пригодиться при работе с кастомными статусами.