register_post_type

Создает новый тип записи или изменяет имеющийся.

Тип записи должен создаваться в момент хука-события init. Он не будет создан, если прикрепить функцию до init и может работать неправильно, если использовать после.

В качестве названия для нового типа записи нужно указывать уникальное имя, отличное от уже имеющихся таксономий, типов записей и зарезервированных WordPress публичных и частных переменных.

С версии 4.6 был создан новый класс WP_Post_Type и весь код функции теперь обрабатывается этим классом, а эта функция стала оберткой для него.

Таксономии

Если для нового типа записи регистрируется таксономия, то всегда регистрируйте эту таксономию при регистрации типа записи, для этого используя параметр taxonomies. Если вы этого не сделаете, тип поста и таксономии не будут опознаны как связанные при срабатывании хуков, таких как: parse_query или pre_get_posts. Это может привести к неожиданным последствиям и ошибкам.

Таксономии нужно регистрировать отдельно. Т.е. несмотря на то, что вы указали таксономии при регистрации нового типа записи, вы должны отдельно зарегистрировать эти таксономии используя register_taxonomy().

Зарезервированные типы постов

Нельзя использовать следующие названия для новых типов постов, так как они используются WordPress:

  • post, page, attachment, revision, nav_menu_item — типы постов WordPress;
  • action, order, theme — названия, которые используются в функциях WordPress.

Во избежании конфликтов с уже используемыми типами постов рекомендуется использовать префикс в названии нового типа поста или указывать уникальную строку.

Хуки из функции:
registered_post_type
Возвращает

WP_Post_Type объект (с версии 4.6).

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

register_post_type( $post_type, $args );


Важно: после создания нового типа записи. Обязательно нужно зайти в «Настройки» > «Постоянные ссылки» и просто нажать там кнопку «Сохранить изменения». Нужно это для того, чтобы правила ЧПУ были пересозданы и туда были добавлены правила нового типа записи.

Шаблон для создания нового типа записи

add_action('init', 'register_post_types');
function register_post_types(){
	register_post_type('post_type_name', array(
		'label'  => null,
		'labels' => array(
			'name'               => '____', // основное название для типа записи
			'singular_name'      => '____', // название для одной записи этого типа
			'add_new'            => 'Добавить ____', // для добавления новой записи
			'add_new_item'       => 'Добавление ____', // заголовка у вновь создаваемой записи в админ-панели.
			'edit_item'          => 'Редактирование ____', // для редактирования типа записи
			'new_item'           => 'Новое ____', // текст новой записи
			'view_item'          => 'Смотреть ____', // для просмотра записи этого типа.
			'search_items'       => 'Искать ____', // для поиска по этим типам записи
			'not_found'          => 'Не найдено', // если в результате поиска ничего не было найдено
			'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине
			'parent_item_colon'  => '', // для родителей (у древовидных типов)
			'menu_name'          => '____', // название меню
		),
		'description'         => '',
		'public'              => false,
		'publicly_queryable'  => null,
		'exclude_from_search' => null,
		'show_ui'             => null,
		'show_in_menu'        => null, // показывать ли в меню адмнки
		'show_in_admin_bar'   => null, // по умолчанию значение show_in_menu
		'show_in_nav_menus'   => null,
		'show_in_rest'        => null, // добавить в REST API. C WP 4.7
		'rest_base'           => null, // $post_type. C WP 4.7
		'menu_position'       => null,
		'menu_icon'           => null, 
		//'capability_type'   => 'post',
		//'capabilities'      => 'post', // массив дополнительных прав для этого типа записи
		//'map_meta_cap'      => null, // Ставим true чтобы включить дефолтный обработчик специальных прав
		'hierarchical'        => false,
		'supports'            => array('title','editor'), // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats'
		'taxonomies'          => array(),
		'has_archive'         => false,
		'rewrite'             => true,
		'query_var'           => true,
	) );
}
$post_type(строка) (обязательный)
Название типа записи (максимум 20 символов). Может содержать только строчные символы, числа, _ или : a-z0-9_-.
По умолчанию: нет
$args(массив)
Массив аргументов.
По умолчанию: нет

Аргументы параметра $args


  • label (строка)


  • labels (массив)


  • description (строка)


  • public (логический)


  • publicly_queryable (логический)


  • exclude_from_search (логический)


  • show_ui (логический)


  • show_in_menu (строка/логический)


  • show_in_admin_bar (логический)


  • show_in_nav_menus (логический)


  • show_in_rest (логический)


  • rest_base (строка)


  • rest_controller_class (строка)


  • menu_position (число)


  • menu_icon (строка)


  • capability_type (строка/массив)


  • capabilities (массив)


  • map_meta_cap (логический)


  • hierarchical (логический)


  • supports (массив)


  • register_meta_box_cb (строка)


  • taxonomies (массив)


  • permalink_epmask (строка)


  • has_archive (строка/логический)


  • rewrite (массив/логический)


  • query_var (строка/логический)


  • can_export (логический)


  • delete_with_user (логический)


  • _builtin (логический)


  • _edit_link (строка)

label(строка)
Имя типа записи помеченное для перевода на другой язык.
По умолчанию: $post_type

labels(массив)

Массив содержащий в себе названия ярлыков для типа записи.

Для нового типа записи, если для неустановленных строк, будут использованы названия (ярлыки) “постов” у не древовидных типов и ярлыки “постоянных страниц” древовидных типов. См. get_post_type_labels()

В массиве можно указать следующие аргументы:

  • name
    основное название для типа записи, обычно во множественном числе.
  • singular_name
    название для одной записи этого типа.
  • add_new
    текст для добавления новой записи, как “добавить новый” у постов в админ-панели. Если нужно использовать перевод названия, вписывайте подобным образом: _x(‘Add New’, ‘product’);
  • add_new_item
    текст заголовка у вновь создаваемой записи в админ-панели. Как “Добавить новый пост” у постов.
  • edit_item
    текст для редактирования типа записи. По умолчанию: редактировать пост/редактировать страницу.
  • new_item
    текст новой записи. По умолчанию: “Новый пост”
  • view_item
    текст для просмотра записи этого типа. По умолчанию: “Посмотреть пост”/”Посмотреть страницу”.
  • search_items
    текст для поиска по этим типам записи. По умолчанию “Найти пост”/”найти страницу”.
  • not_found
    текст, если в результате поиска ничего не было найдено. По умолчанию: “Постов не было найдено”/”Страниц не было найдено”.
  • not_found_in_trash
    текст, если не было найдено в корзине. По умолчанию “Постов не было найдено в корзине”/”Страниц не было найдено в корзине”.
  • parent_item_colon
    текст для родительских типов. Этот параметр не используется для не древовидных типов записей. По умолчанию “Родительская страница”.
  • all_items
    Все записи. По умолчанию равен menu_name
  • archives
    Архивы записей. По умолчанию равен all_items
  • insert_into_item
    Вставить в запись
  • uploaded_to_this_item
    Загружено для этой записи
  • featured_image
    Миниатюра записи
  • set_featured_image
    Установить миниатюру записи
  • remove_featured_image
    Удалить миниатюру записи
  • use_featured_image
    Использовать как миниатюру записи
  • filter_items_list
    Фильтровать список записей
  • items_list_navigation
    Навигация по записям
  • items_list
    Список записей
  • menu_name
    Название меню. По умолчанию равен name.
  • name_admin_bar
    Название в админ баре (тулбаре). По умолчанию равен singular_name.

  • view_items
    Название в тулбаре, для страницы архива типа записей. По умолчанию: «View Posts» / «View Pages». С WP 4.7.

  • attributes
    Название для метабокса атрибутов записи. У страниц такой метабокс называется «Свойства страницы» («Page Attributes»). По умолчанию: «Post Attributes» или «Page Attributes». С WP 4.7.

По умолчанию: если не установлено, name и singular_name примят значение аргумента label

description(строка)
Короткое описание этого типа записи.
По умолчанию: ”

public(логический)

Определяет является ли тип записи публичным или нет. На основе этого параметра строятся много других, т.е. это своего рода предустановка для комплекса других параметров.

    • не показывать пользовательский интерфейс (UI) для этого типа записей (show_ui=false)
    • запросы относящиеся к этому типу записей не будут работать в шаблоне (publicly_queryable=false)
    • этот тип записей не будет учитываться при поиске по сайту (exclude_from_search=true)
    • этот тип записей будет спрятан из выбора меню навигации (show_in_nav_menus=false).
  • true
    • show_ui=true
    • publicly_queryable=true
    • exclude_from_search=false
    • show_in_nav_menus=true

По умолчанию: false

publicly_queryable(логический)
Запросы относящиеся к этому типу записей будут работать во фронтэнде (в шаблоне сайта).
По умолчанию: значение глобального аргумента (public)

exclude_from_search(логический)

Исключить ли этот тип записей из поиска по сайту. 1 (true) – да, 0 (false) – нет.

Если этот параметр установлен в true, то для терминов таксономий привязанных к этому типу записей, вывод работать не будет (пусть даже параметр public равен true). Т.е. этот тип постов будет полностью исключен из запросов типа query_posts()!

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

show_ui(логический)
Показывать ли меню для управления этим типом записи в админ-панели. false – не показывать меню, true – показывать меню в админ-панели.
По умолчанию: значение аргумента public

show_in_menu(строка/логический)

Показывать ли тип записи в администраторском меню и где именно показывать управление этим типом записи. Аргумент show_ui должен быть включен!

  • false – не показывать в администраторском меню.
  • true – показывать как меню первого уровня.
  • строка – показывать как страницу первого уровня, как например ‘tools.php’ или ‘edit.php?post_type=page’
ЗАМЕТКА: Если используется строка для того, чтобы показать как подменю, какого-нибудь главного меню, создаваемого плагином, этот пункт станет первым в списке и соответственно изменит расположение пунктов меню. Для того, чтобы этого не произошло, в плагине, который создает свое меню нужно установить приоритет для действия admin_menu 9 или ниже.

По умолчанию: null

show_in_admin_bar(логический)
Сделать этот тип доступным из админ бара.
По умолчанию: null (значение $show_in_menu)

show_in_nav_menus(логический)
Включить возможность выбирать этот тип записи в меню навигации.
По умолчанию: значение глобального аргумента

show_in_rest(логический)
Нужно ли включать тип записи в REST API. С WP 4.7.

rest_base(строка)
Ярлык в REST API. По умолчанию, название типа записи. С WP 4.7.
По умолчанию: $post_type

rest_controller_class(строка)
Название класса контроллера в REST API. С WP 4.7.
По умолчанию: ‘WP_REST_Terms_Controller

menu_position(число)

Позиция где должно расположится меню нового типа записи:

  • 1 — в самом верху меню
  • 2-3 — под «Консоль»
  • 4-9 — под «Записи»
  • 10-14 — под «Медиафайлы»
  • 15-19 — под «Ссылки»
  • 20-24 — под «Страницы»
  • 25-59 — под «Комментарии» (по умолчанию, null)
  • 60-64 — под «Внешний вид»
  • 65-69 — под «Плагины»
  • 70-74 — под «Пользователи»
  • 75-79 — под «Инструменты»
  • 80-99 — под «Параметры»
  • 100+ — под разделителем после «Параметры»

По умолчанию: null

menu_icon(строка)
Ссылка на картинку, которая будет использоваться для этого меню.
С выходом WordPress 3.8 появился новый пакет иконок Dashicons, который входит в состав ядра WordPress. Это комплект из более 150 векторных изображений. Чтобы установит одну из иконок, напишите её название в этот параметр. Например иконка постов, называется так: dashicons-admin-post, а ссылок dashicons-admin-links.
По умолчанию: null – иконка как у меню постов

capability_type(строка/массив)

Строка которая будет маркером для установки прав для этого типа записи.
Встроенные маркеры это: post и page.

Можно передавать массив, где первое значение будет использоваться для единственного числа, а второе для множественного, например: array('story', 'stories'). Если передается строка, то для множественного числа просто прибавляется ‘s’ на конце.

capability_type используется для построения списка прав, которые будут записаны в параметр ‘capabilities’.

При установке нестандартного маркера (не post или page), параметр map_meta_cap можно установить в true или в false:

  • Если поставить true — то WordPress автоматически сгенерирует группу прав для параметра 'capabilities' на основе введенных здесь данных. При этом указанные в параметре 'capabilities' права дополнят имеющийся список прав.
  • Если установить false — то WordPress ничего генерировать не будет и вам придется самому полностью прописать все возможные права для этого типа записи в параметре ‘capabilities’.

По умолчанию: “post”

Пример: допустим мы указали тут строку bill что равносильно array(‘bill’, ‘bills’), тогда WordPress автоматически сгенерирует следующие права для параметра ‘capabilities’:

add_action('init', 'my_custom_init');
function my_custom_init(){
	register_post_type('book', array(
		'labels'             => array(
			'name'               => 'Книги', // Основное название типа записи
			'singular_name'      => 'Книга', // отдельное название записи типа Book
			'add_new'            => 'Добавить новую',
			'add_new_item'       => 'Добавить новую книгу',
			'edit_item'          => 'Редактировать книгу',
			'new_item'           => 'Новая книга',
			'view_item'          => 'Посмотреть книгу',
			'search_items'       => 'Найти книгу',
			'not_found'          =>  'Книг не найдено',
			'not_found_in_trash' => 'В корзине книг не найдено',
			'parent_item_colon'  => '',
			'menu_name'          => 'Книги'

		  ),
		'public'             => true,
		'publicly_queryable' => true,
		'show_ui'            => true,
		'show_in_menu'       => true,
		'query_var'          => true,
		'rewrite'            => true,
		'capability_type'    => 'post',
		'has_archive'        => true,
		'hierarchical'       => false,
		'menu_position'      => null,
		'supports'           => array('title','editor','author','thumbnail','excerpt','comments')
	) );
}

Сообщения при публикации или изменении типа записи book:

// Раздел "помощь" типа записи book
add_action( 'contextual_help', 'add_help_text', 10, 3 );
function add_help_text( $contextual_help, $screen_id, $screen ){
	//$contextual_help .= print_r($screen); // используйте чтобы помочь определить параметр $screen->id
	if('book' == $screen->id ) {
		$contextual_help = '
		<p>Напоминалка при редактировании записи book:</p>
		<ul>
			<li>Указать жанр, например Фантастика или История.</li>
			<li>Указать автора книги.</li>
		</ul>
		<p>Если нужно запланировать публикацию на будущее:</p>
		<ul>
			<li>В блоке с кнопкой "опубликовать" нажмите редактировать дату.</li>
			<li>Измените дату на нужную, будущую и подтвердите изменения кнопкой ниже "ОК".</li>
		</ul>
		<p><strong>За дополнительной информацией обращайтесь:</strong></p>
		<p><a href="/" target="_blank">Блог о WordPress</a></p>
		<p><a href="http://wordpress.org/support/" target="_blank">Форум поддержки</a></p>
		';
	}
	elseif( 'edit-book' == $screen->id ) {
		$contextual_help = '<p>Это раздел помощи показанный для типа записи Book и т.д. и т.п.</p>';
	}

	return $contextual_help;
}

#2 Добавление элемента таксономии в ЧПУ

Для нового типа записи можно указать разные ЧПУ с помощью параметра rewrite. Этот пример показывает, как добавить в ЧПУ нового типа записи таксономию.

Допустим, мы регистрируем типа записи catalog и таксономию products для него. Далее, нам нужно чтобы при публикации записи и выборе для нее элемента таксономии. Этот элемент добавлялся в ЧПУ и в результате ссылка на тип записи выглядела так:
http://site.ru/post_type_name/taxonomy_term_name/post_name.

Для этого нужно указать аргумент slug в параметре rewrite при регистрации типа записи:

'rewrite' => array( 'slug'=>'catalog/%products%', 'with_front' => false ),
'has_archive' => 'catalog', // если нужна страница архива тут указываем её ярлык а не true

Теперь нужно добавить хук, чтобы заменять %products% при получении ссылки на запись через функцию get_permalink() и производные от нее функции:

## Отфильтруем ЧПУ произвольного типа
// сам фильтр: apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );
add_filter('post_type_link', 'products_permalink', 1, 2);

function products_permalink( $permalink, $post ){
	// выходим если это не наш тип записи: без холдера %products%
	if( strpos($permalink, '%products%') === FALSE )
		return $permalink;

	// Получаем элементы таксы
	$terms = get_the_terms($post, 'products');
	// если есть элемент заменим холдер
	if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) )
		$taxonomy_slug = $terms[0]->slug;
	// элемента нет, а должен быть...
	else
		$taxonomy_slug = 'no-products';

	return str_replace('%products%', $taxonomy_slug, $permalink );
}

В результате ЧПУ записи будет как указано выше и ссылка будет распознаваться правилами перезаписи WordPress.

#3 Добавление таксономии в ЧПУ

Этот пример показывает как создать запись типа Вопросы и разделы для нее. При этом ЧПУ будут:

  • У записи: site.ru/faq/{категория}/{ярлык-записи}
  • У таксы: site.ru/faq/{категория}
add_action( 'init', 'register_faq_post_type' );
function register_faq_post_type() {
	// Раздел вопроса - faqcat
	register_taxonomy('faqcat', array('faq'), array(
		'label'                 => 'Раздел вопроса', // определяется параметром $labels->name
		'labels'                => array(
			'name'              => 'Разделы вопросов',
			'singular_name'     => 'Раздел вопроса',
			'search_items'      => 'Искать Раздел вопроса',
			'all_items'         => 'Все Разделы вопросов',
			'parent_item'       => 'Родит. раздел вопроса',
			'parent_item_colon' => 'Родит. раздел вопроса:',
			'edit_item'         => 'Ред. Раздел вопроса',
			'update_item'       => 'Обновить Раздел вопроса',
			'add_new_item'      => 'Добавить Раздел вопроса',
			'new_item_name'     => 'Новый Раздел вопроса',
			'menu_name'         => 'Раздел вопроса',
		),
		'description'           => 'Рубрики для раздела вопросов', // описание таксономии
		'public'                => true,
		'show_in_nav_menus'     => false, // равен аргументу public
		'show_ui'               => true, // равен аргументу public
		'show_tagcloud'         => false, // равен аргументу show_ui
		'hierarchical'          => true,
		'rewrite'               => array('slug'=>'faq', 'hierarchical'=>false, 'with_front'=>false, 'feed'=>false ),
		'show_admin_column'     => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5)
	) );

	// тип записи - вопросы - faq
	register_post_type('faq', array(
		'label'               => 'Вопросы',
		'labels'              => array(
			'name'          => 'Вопросы',
			'singular_name' => 'Вопрос',
			'menu_name'     => 'Архив вопросов',
			'all_items'     => 'Все вопросы',
			'add_new'       => 'Добавить вопрос',
			'add_new_item'  => 'Добавить новый вопрос',
			'edit'          => 'Редактировать',
			'edit_item'     => 'Редактировать вопрос',
			'new_item'      => 'Новый вопрос',
		),
		'description'         => '',
		'public'              => true,
		'publicly_queryable'  => true,
		'show_ui'             => true,
		'show_in_rest'        => false,
		'rest_base'           => '',
		'show_in_menu'        => true,
		'exclude_from_search' => false,
		'capability_type'     => 'post',
		'map_meta_cap'        => true,
		'hierarchical'        => false,
		'rewrite'             => array( 'slug'=>'faq/%faqcat%', 'with_front'=>false, 'pages'=>false, 'feeds'=>false, 'feed'=>false ),
		'has_archive'         => 'faq',
		'query_var'           => true,
		'supports'            => array( 'title', 'editor' ),
		'taxonomies'          => array( 'faqcat' ),
	) );

}

## Отфильтруем ЧПУ произвольного типа
// фильтр: apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );
add_filter('post_type_link', 'faq_permalink', 1, 2);
function faq_permalink( $permalink, $post ){
	// выходим если это не наш тип записи: без холдера %products%
	if( strpos($permalink, '%faqcat%') === false )
		return $permalink;

	// Получаем элементы таксы
	$terms = get_the_terms($post, 'faqcat');
	// если есть элемент заменим холдер
	if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) )
		$term_slug = array_pop($terms)->slug;
	// элемента нет, а должен быть...
	else
		$term_slug = 'no-faqcat';

	return str_replace('%faqcat%', $term_slug, $permalink );
}

Заметки

Есть удобный плагин, который позволяет регистрировать новые типы записей (постов) и новые таксономии: Custom Post Type UI

Код из


wp-includes/post.php

WP 4.7.2

<?php
function register_post_type( $post_type, $args = array() ) {
	global $wp_post_types;

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

	// Sanitize post type name
	$post_type = sanitize_key( $post_type );

	if ( empty( $post_type ) || strlen( $post_type ) > 20 ) {
		_doing_it_wrong( __FUNCTION__, __( 'Post type names must be between 1 and 20 characters in length.' ), '4.2.0' );
		return new WP_Error( 'post_type_length_invalid', __( 'Post type names must be between 1 and 20 characters in length.' ) );
	}

	$post_type_object = new WP_Post_Type( $post_type, $args );
	$post_type_object->add_supports();
	$post_type_object->add_rewrite_rules();
	$post_type_object->register_meta_boxes();

	$wp_post_types[ $post_type ] = $post_type_object;

	$post_type_object->add_hooks();
	$post_type_object->register_taxonomies();

	/**
	 * Fires after a post type is registered.
	 *
	 * @since 3.3.0
	 * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
	 *
	 * @param string       $post_type        Post type.
	 * @param WP_Post_Type $post_type_object Arguments used to register the post type.
	 */
	do_action( 'registered_post_type', $post_type, $post_type_object );

	return $post_type_object;
}

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


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

Your email address will not be published. Required fields are marked *