register_post_status()WP 3.0.0

Функция для создания нового или редактирования старого статуса поста, на основе переданных параметров.

Эта функция должна вызываться во время или после события init.

Функциональность статусов недоделана

Эта функция не добавляет новый статус записи в админ-панель (как опцию при редактировании записи или в быстром редактировании). Функция в процессе разработки.

Обходные пути проблемы статусов обсуждаются здесь:
https://stackoverflow.com/q/20298346/612253

Статусы не привязаны к типу поста
Статусы записей в WordPress существуют независимо от типов записей — они глобальны.
Т.е. они не привязан к конкретному типу записи (например, к post или page).

Статусы объявляются в коде, и их список можно получить через:

global $wp_post_statuses;

Они не хранятся в базе данных как отдельный список — они просто используются как значения поля post_status в таблице wp_posts.

Если нужно чтобы для отдельно типа поста отображались только нужные статусы, то придется использовать фильтр чтобы изменить список.

Используйте get_post_status_object(), чтобы получить данные зарегистрированного статуса.

Основа для: create_initial_post_types()

Хуков нет.

Возвращает

Объект.

Использование

register_post_status( $post_status, $args );
$post_status(строка) (обязательный)

Название статуса поста. Не более 20 символов!

Статусы уже зарегистрированные в WP:

  • publish - опубликованный пост;
  • inherit - ревизия;
  • pending - на проверке;
  • private - личная запись (доступна только автору);
  • future - публикация в будущем;
  • draft - черновик;
  • trash - запись находится в корзине.

Максимальное кол-во символов для $post_status - 20

Такое ограничение установлено в БД для поля post_status. Если указать строку длиннее, то все лишнее будет обрезано. См. схему таблицы wp_posts.

Если указать статус более 20 символов, то он зарегистрируется, но обновляться пост не будет. Вместо этого метод $wpdb->process_fields() сравнивает преобразованные данные с предоставленными данными и возвращает false, потому что они различаются.

global $wpdb;
$res = $wpdb->get_col_length( $wpdb->posts, 'post_status' );

print_r( $res );
// Array( [type] => char  [length] => 20 )
$args(строка/массив)

Массив аргументов статуса поста. По умолчанию:

// Аргументы с начальным _ зарезервированы для внутреннего использования.
$defaults = array(
	'label'                     => false,
	'label_count'               => false,
	'exclude_from_search'       => null,
	'_builtin'                  => false,
	'public'                    => null,
	'internal'                  => null,
	'protected'                 => null,
	'private'                   => null,
	'publicly_queryable'        => null,
	'show_in_admin_status_list' => null,
	'show_in_admin_all_list'    => null,
);
  • label(строка)
    Описывающее название для статуса поста, предназначенное для перевода.
    По умолчанию: $post_status

  • label_count(строка)
    Текст отображаемый в консоли админ панели (если вы не хотите количество записей с этим статусом).
    По умолчанию: false

  • exclude_from_search(логический)
    Исключить ли посты с этим статусом из результатов поиска. true - исключить.
    По умолчанию: значение $internal

  • public(логический)
    Показывать ли посты с этим статусом в лицевой части сайта. true - показывать.
    По умолчанию: null

  • internal(true/false)
    Статус предназначен только для внутреннего использования.
    Default: false

  • protected(true/false)
    Должен ли быть пост с этим статусом защищенным (protected)?
    Default: false

  • private(true/false)
    Должен ли быть пост с этим статусом приватным?
    Default: false

  • publicly_queryable(true/false)
    Должен ли пост с этим статусом участвовать в публичных запросах?
    Default: значение $public

  • show_in_admin_all_list(логический)
    Включить ли записи с этим статусом в список записей в админ-панели.
    При true:

    • то значение поля show_in_list в REST запросе получит это значение.
    • записи с этим статусом попадают в общий список «Все» в таблице постов в админке и учитываются в счётчике.
    • включаются в запрос для WP_Query по умолчанию, когда статус не указан или any.

    По умолчанию: обратное значение $internal

  • show_in_admin_status_list(логический)
    Показывать ли статус в списке статусов вверху таблицы постов:

    status-in-head

    По умолчанию: обратное значение $internal

  • _builtin(true/false)
    Является ли статус встроенным. Только для использования ядром.
    Default: false

Примеры

1

#1 Пример регистрации статуса поста под названием Unread:

add_action( 'init', 'my_custom_post_status' );
function my_custom_post_status(){
	register_post_status( 'unread', array(
		'label'                     => _x( 'Unread', 'post' ),
		'public'                    => true,
		'exclude_from_search'       => false,
		'show_in_admin_all_list'    => true,
		'show_in_admin_status_list' => true,
		'label_count'               => _n_noop( 'Unread <span class="count">(%s)</span>', 'Unread <span class="count">(%s)</span>' ),
	) );
}
0

#2 Как добавить собственный статус записи в WordPress

Читайте в заметке: https://wp-kama.ru/note/add-custom-post-status

Заметки

  • Global. stdClass[]. $wp_post_statuses Inserts new post status object into the list

Список изменений

С версии 3.0.0 Введена.

Код register_post_status() WP 6.9.1

function register_post_status( $post_status, $args = array() ) {
	global $wp_post_statuses;

	if ( ! is_array( $wp_post_statuses ) ) {
		$wp_post_statuses = array();
	}

	// Args prefixed with an underscore are reserved for internal use.
	$defaults = array(
		'label'                     => false,
		'label_count'               => false,
		'exclude_from_search'       => null,
		'_builtin'                  => false,
		'public'                    => null,
		'internal'                  => null,
		'protected'                 => null,
		'private'                   => null,
		'publicly_queryable'        => null,
		'show_in_admin_status_list' => null,
		'show_in_admin_all_list'    => null,
		'date_floating'             => null,
	);
	$args     = wp_parse_args( $args, $defaults );
	$args     = (object) $args;

	$post_status = sanitize_key( $post_status );
	$args->name  = $post_status;

	// Set various defaults.
	if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private ) {
		$args->internal = true;
	}

	if ( null === $args->public ) {
		$args->public = false;
	}

	if ( null === $args->private ) {
		$args->private = false;
	}

	if ( null === $args->protected ) {
		$args->protected = false;
	}

	if ( null === $args->internal ) {
		$args->internal = false;
	}

	if ( null === $args->publicly_queryable ) {
		$args->publicly_queryable = $args->public;
	}

	if ( null === $args->exclude_from_search ) {
		$args->exclude_from_search = $args->internal;
	}

	if ( null === $args->show_in_admin_all_list ) {
		$args->show_in_admin_all_list = ! $args->internal;
	}

	if ( null === $args->show_in_admin_status_list ) {
		$args->show_in_admin_status_list = ! $args->internal;
	}

	if ( null === $args->date_floating ) {
		$args->date_floating = false;
	}

	if ( false === $args->label ) {
		$args->label = $post_status;
	}

	if ( false === $args->label_count ) {
		// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingular,WordPress.WP.I18n.NonSingularStringLiteralPlural
		$args->label_count = _n_noop( $args->label, $args->label );
	}

	$wp_post_statuses[ $post_status ] = $args;

	return $args;
}
9 комментариев