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' );

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

Комментарии 3

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...