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

До сих пор мне ещё ни разу не требовалось создавать новый статус записей, то есть мне всегда хватало стандартных — опубликованные посты, черновики и т.д. Для тех, кто всё же столкнулся с этой необходимостью, существует функция 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
);

Отмечу, что, если значение параметра 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' );

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

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: