register_post_status() — регистрация статуса постов

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

До сих пор мне ещё ни разу не требовалось создавать новый статус записей, то есть мне всегда хватало стандартных — опубликованные посты, черновики и т.д. Для тех, кто всё же столкнулся с этой необходимостью, существует функция register_post_status().

Прежде всего хочу отметить, что эта функция ещё не доведена до ума (версия WordPress на момент написания этого поста — 4.0) и для того, чтобы создать полноценный статус записей, нам потребуется прибегнуть к помощи хуков.

Кстати, стандартные статусы постов регистрируются ей же.

register_post_status( $post_status, $args = array() )
$post_status
(строка) Название статуса.
$args
(массив) Массив параметров регистрируемого статуса. Список параметров массива по умолчанию:

$default_args = array(
        'label' => false, // название статуса, например "Архив"
        'public' => null, // разрешить отображать посты данного статуса на сайте
        'show_in_admin_status_list' => null, // нужно ли отображать количество постов данного статуса на странице всех постов
        'label_count' => false, // ярлыки для отображения количества постов данного статуса на странице всех постов
        'exclude_from_search' => null, // нужно ли исключить посты данного статуса из результатов поиска
        'show_in_admin_all_list' => null,
        'publicly_queryable' => null,
        'private' => null,
        'protected' => null,
        'internal' => null,
        '_builtin' => false
);
$default_args = array(
        'label' => false, // название статуса, например "Архив"
        'public' => null, // разрешить отображать посты данного статуса на сайте
        'show_in_admin_status_list' => null, // нужно ли отображать количество постов данного статуса на странице всех постов
        'label_count' => false, // ярлыки для отображения количества постов данного статуса на странице всех постов
        'exclude_from_search' => null, // нужно ли исключить посты данного статуса из результатов поиска
        'show_in_admin_all_list' => null,
        'publicly_queryable' => null,
        'private' => null,
        'protected' => null,
        'internal' => null,
        '_builtin' => false
);

Отмечу, что, если значение параметра show_in_admin_status_list будет равным true, то в админке появится ссылка на отдельную страницу со всеми постами данного статуса.

Пример: зарегистрируем статус поста «Архивы»

Статусы постов должны регистрироваться раньше, чем произвольные типы постов, поэтому мы подключаем функцию к хуку init.

В functions.php отправляется следующий код:

function true_status_custom(){
        register_post_status( 'archive', array(
                'label'                     => 'Архив',
                'label_count'               => _n_noop( 'Архив <span class="count">(%s)</span>', 'Архивы <span class="count">(%s)</span>' ),
                'public'                    => true,
                'show_in_admin_status_list' => true // если установить этот параметр равным false, то следующий параметр можно удалить
        ) );
}
add_action( 'init', 'true_status_custom' );

После добавления этого кода в админке вряд ли произойдут хоть какие-то изменения. Однако вы уже сможете использовать этот статус при создании нового поста (через функцию) или в WP_Query.

Добавление статуса в drop-down статусов на странице редактирования записи

Вторым шагом мы добавим наш статус вот сюда:

Для этого мы добавим ещё немного кода в файл functions.php:

function true_append_post_status_list(){
        global $post;
        $optionselected = '';
        $statusname = '';
        if( $post->post_type == 'post' ){ // если хотите, можете указать тип поста, для которого регистрируем статус, а можете и вовсе избавиться от этого условия
                if($post->post_status == 'archive'){ // если посту присвоен статус архива
                        $optionselected = ' selected="selected"';
                        $statusname = "$('#post-status-display').text('Архивировано');";
                }
                /*
                 * Код jQuery мы просто выводим в футере
                 */
                echo "<script>
                jQuery(function($){
                        $('select#post_status').append('<option value="archive"$optionselected>Архив</option>');
                        $statusname
                });
                </script>";
        }
}
add_action('admin_footer-post-new.php', 'true_append_post_status_list'); // страница создания нового поста
add_action('admin_footer-post.php', 'true_append_post_status_list'); // страница редактирования поста

Добавляем метку статуса

Я не знал, как ещё это можно было назвать, так что лучше смотрите на скриншоте:

Для того, чтобы ярлык архивов добавлялся к постам так же, как ярлыки черновиков и личных постов, вставляйте код ниже в functions.php:

function true_status_display( $statuses ) {
        global $post;
        if( get_query_var( 'post_status' ) != 'archive' ){ // проверка, что мы не находимся на странице всех постов данного статуса
                if($post->post_status == 'archive'){ // если статус поста - Архив
                        return array('Архив');
                }
        }
        return $statuses;
}
 
add_filter( 'display_post_states', 'true_status_display' );

Вот в принципе и всё, статус добавлен. Также ещё есть пост-продолжение про добавление вашего статуса в быстрое редактирование постов.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии