До сих пор мне ещё ни разу не требовалось создавать новый статус записей, то есть мне всегда хватало стандартных — опубликованные посты, черновики и т.д. Для тех, кто всё же столкнулся с этой необходимостью, существует функция register_post_status()
.
Прежде всего хочу отметить, что эта функция ещё не доведена до ума (версия WordPress на момент написания этого поста — 4.0) и для того, чтобы создать полноценный статус записей, нам потребуется прибегнуть к помощи хуков.
Кстати, стандартные статусы постов регистрируются ей же.
register_post_status( $post_status, $args = array() )
$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.
Вторым шагом мы добавим наш статус вот сюда:
Для этого мы добавим ещё немного кода в файл 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' );
Вот в принципе и всё, статус добавлен. Также ещё есть пост-продолжение про добавление вашего статуса в быстрое редактирование постов.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
нету статуса при "бистрое редактириваня"
Подскажите как добавить выбор статуса в быстром редактировании?
Я опубликую пост об этом в ближайшую пятницу.
Работает и сейчас, на актуальной версии WP, спасибо