register_post_type() WP 2.9.0

Створює новий тип запису або змінює наявний.

init . Він не буде створений, якщо прикріпити функцію до init і може працювати неправильно, якщо використати після.

Як назву для нового типу запису потрібно вказувати унікальне ім’я, відмінне від вже наявних таксономій, типів записів та зарезервованих WordPress публічних та приватних змінних .

Важливо: після створення нового запису. Обов’язково треба зайти на сторінку Настройки → Постоянные ссылки. Потрібно це для того, щоб правила ЧПУ були перестворені і були додані правила нового типу запису.

З версії 4.6 створено новий клас WP_Post_Type і весь код функції тепер обробляється цим класом, а ця функція стала обгорткою для нього.

Таксономії

Якщо для нового типу запису реєструється таксономія, то завжди реєструйте таксономію при реєстрації типу запису, для цього використовуючи параметр taxonomies. Якщо ви цього не зробите, тип посту та таксономії не будуть упізнані як пов’язані при спрацьовуванні хуків, таких як: parse_queryабо pre_get_posts. Це може призвести до несподіваних наслідків та помилок.

Таксономію потрібно реєструвати окремо. Незважаючи на те, що таксономія вказується при реєстрації типу запису, реєструвати таксономію потрібно окремо за допомогою register_taxonomy() .

Спочатку потрібно реєструвати таксономію, а потім тип запису, з яким ця таксономія пов’язана!

// правильний порядок реєстрації типу запису та її таксономії
register_taxonomy(...);
register_post_type(...);

Ця особливість у деяких випадках позбавить вас від багів та купи витраченого часу.

Працює на основі:
WP_Post_Type()
Основа для
create_initial_post_types()

Повертає

WP_Post_Type|WP_Error. WP_Post_Type об’єкт (з версією 4.6).

Шаблон для створення нового типу запису
add_action( 'init', 'register_post_types');

function register_post_types(){

	register_post_type( 'post_type_name', [
		'label' => null,
		'labels' => [
			'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' => true,
		// 'publicly_queryable' => null, // залежить від public
		// 'exclude_from_search' => null, // залежить від public
		// 'show_ui' => null, // залежить від public
		// 'show_in_nav_menus' => null, // залежить від public
		'show_in_menu' => null, // чи показувати в меню адмнки
		// 'show_in_admin_bar' => null, // залежить від show_in_menu
		'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' => [ 'title', 'editor' ], // 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments' ,'revisions','page-attributes','post-formats'
		'taxonomies' => [],
		'has_archive' => false,
		'rewrite' => true,
		'query_var' => true,
	]);

}

Використання

register_post_type($post_type, $args);
$post_type
(рядок) (обов’язковий)

Назва типу запису (максимум 20 символів). Може містити лише малі символи, числа, _або -: a-z0-9_-(визначається роботою sanitize_key() ).

Зарезервовані назви для типів постів . Не можна використовувати наступні назви для нових типів постів, оскільки вони використовуються WordPress і ваш код конфліктуватиме з поточним кодом або функціями WordPress:

post
page
attachment
revision
nav_menu_item
custom_css
customize_changeset
action
author
order
theme
$args
(масив)
Масив аргументів.


За замовчуванням: array() (параметри за замовчуванням)

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


label
(рядок)
Ім’я типу запису позначене для перекладу іншою мовою.

Примітка: Без якості label не вдасться зробити окремий шаблон виведення для кастомного типу запису.


За замовчуванням $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.
'item_updated' => '', // Текст нотатки у редакторі запису під час оновлення записи. WP 5.0.
									 // За замовчуванням: "Post updated." / "Page updated."
'item_published' => '', // Текст нотатки у редакторі запису під час публікації записи. WP 5.0.
									 // За замовчуванням: "Post published." / "Page published."
'item_published_privately' => '', // Текст нотатки у редакторі запису при публікації private записи. WP 5.0.
									 // За замовчуванням: "Post published privately." / «Page published
'item_reverted_to_draft' => '', // Текст нотатки в редакторі запису при поверненні запису в draft. WP 5.0.
									 // За замовчуванням: "Post reverted to draft." / «Page reverted to
'item_scheduled' => '', // Текст нотатки у редакторі записи при запланованій публікації на майбутню дату. WP 5.0.
									 // За замовчуванням: "Post scheduled." / "Page scheduled."

Для повного списку значень див. get_post_type_labels()

За промовчанням: якщо не встановлено, name і singular_name приймуть значення аргументу label


description
(рядок)
Короткий опис цього запису. Значення використовується у REST API. Значення можна отримати за допомогою функції
get_the_post_type_description() .


За замовчуванням: ”

public
(логічний)

Визначає чи є тип запису публічним чи ні. За підсумками цього параметра будуються багато інших, тобто. це свого роду перед-установка для наступних параметрів:

  • false

    • show_ui = false – не показувати інтерфейс користувача (UI) для цього типу записів
    • 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
(логічний)

true включить публічний перегляд записів цього типу – це означає, що у фронт-енді будуть працювати URL запити для цього типу записів, наприклад:

// без ЧПУ
?post_type={post_type_key}
?{post_type_key}={single_post_slug}
?{post_type_query_var}={single_post_slug}

// при включеному ЧПУ
/book/my-book-name

При false записи цього типу будуть недоступні у фронт-енді через звичайні URL-адреси запити і на запит до поточного типу запису ви побачите 404 сторінку.

Перевірка цього параметра відбувається у методі WP::parse_request() під час обробки базового запиту WP.

Примітка: якщо параметр query_var порожній ''|null|false, WordPress все одно спробує обробити його та віддасть 404 сторінку.

Примітка: якщо publicly_queryable = falseі query_var = true, то при переході на URL-адресу запису ми побачимо головну сторінку УВАГА з кодом відповіді 200! Тому при publicly_queryable = falseабо public = falseпотрібно також вказати query_var = false, в цьому випадку при переході на URL запису ми, як і належить, побачимо 404 сторінку.

За замовчуванням значення параметра (public)

Чи виключити цей тип записів із пошуку по сайту. 1 (true) – так, 0 (false) – ні.

Якщо цей параметр встановлений в true, то для термінів таксономій прив’язаних до цього типу записів, висновок не працюватиме (нехай навіть параметр public дорівнює true). Тобто. цей тип постів буде повністю виключений із запитів типу query_posts()!

За замовчуванням: обернене значення аргументу public


show_ui
(логічний)

Визначає, чи потрібно створювати логіку управління типом запису з адмін-панелі. Чи потрібно створювати UI типу запису, щоб можна було керувати.

Так, наприклад, якщо вказати true , а show_in_menu = false . То ми матимемо можливість зайти сторінку управління типом записи, тобто. двигун розумітиме і оброблятиме такі запити, але посилання на цю сторінку в меню не буде …

За промовчанням значення аргументу public


show_in_menu
(рядок/логічний)

Чи показувати тип запису в адміністраторському меню і де саме показувати керування типом запису. Аргумент show_ui має бути включений!

  • false– не відображати в адміністраторському меню.
  • true– Показувати як меню першого рівня.
  • строка– показувати як підменю меню першого рівня, наприклад, підменю для ‘tools.php’ або ‘edit.php?post_type=page’ для довільних типів меню потрібно вказувати $menu_slug див. add_menu_page() .

ЗАМІТКА: Якщо використовується строкадля того, щоб показати як підменю, якогось головного меню, створюваного плагіном, цей пункт стане першим у списку і відповідно змінить розташування пунктів меню. Для того, щоб цього не сталося, у плагіні, яка створює своє меню, потрібно встановити пріоритет для події admin_menu 9 або нижче.

Типово: значення параметра show_ui


show_in_admin_bar
(логічний)
Зробити цей тип доступним із адмін бару.


Типово: null (значення show_in_menu)

show_in_nav_menus
(логічний)
Увімкнути можливість вибирати цей тип запису у меню навігації.


Типово: значення параметра public

show_in_rest
(логічний) (WP 4.7)

Чи потрібно включати тип запису REST API. true — додасть тип запису до маршруту wp/v2.

Також впливає роботу блокового редактора Gutenberg: true – редактор Gutenberg включений цього типу записи, false – використовуватиметься звичайний редактор.

Типово: false


rest_base
(рядок) (WP 4.7)
Ярлик у REST API. За замовчуванням назва типу запису.


За замовчуванням $post_type

rest_controller_class
(рядок) (WP 4.7)
Назва класу контролера у REST API.


За замовчуванням: ‘ WP_REST_Posts_Controller

rest_namespace
(рядок) (WP 5.9)
Вказує префікс (простір імен) у URL REST API маршруту.


За промовчанням wp/v2

Позиція, де має розташуватися меню нового типу запису:

  • 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

Посилання на картинку, яка використовуватиметься для цього меню.

З виходом WordPress 3.8 з’явився новий пакет іконок Dashicons , що входить до складу ядра WordPress. Це комплект понад 150 векторних зображень. Щоб установити одну з іконок, напишіть її назву для цього параметра. Наприклад, іконка постів називається так: dashicons-admin-post, а посилань dashicons-admin-links.

Приклади:

'dashicons-admin-post' // значок dashicons.

get_template_directory_uri() .'/images/icon.png' // посилання на картинку.

'data:image/svg+xml;base64,' . base64_encode('<svg width="20" height="20"><path fill="black" /></svg>')
// Пряма вказівка ​​SVG іконки у base64 форматі.
// Готовий SVG можна взяти за посиланням: https://github.com/encharm/Font-Awesome-SVG-PNG/tree/master/black/svg
// Тут важливо врахувати два моменти:
// 1) для path потрібно вказати атрибут fill="black", щоб WordPress міг змінювати колір іконки під вибрану тему.
// 2) Потрібно змінити висоту/ширину іконки на 20px, тому що це базовий розмір WordPress.

'none' // додасть до елементу клас ".wp-menu-image empty", це дозволить встановити іконку через CSS.

Типово: 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’.

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

[cap] => stdClass Object(
	// Meta права
	[edit_post] => edit_bill
	[read_post] => read_bill
	[delete_post] => delete_bill

	// Примітивні права, що не використовуються в map_meta_cap()
	[edit_posts] => edit_bills
	[edit_others_posts] => edit_others_bills
	[publish_posts] => publish_bills
	[read_private_posts] => read_private_bills
	[read] => read
	[delete_posts] => delete_bills
	[delete_private_posts] => delete_private_bills
	[delete_published_posts] => delete_published_bills
	[delete_others_posts] => delete_others_bills
	[edit_private_posts] => edit_private_bills
	[edit_published_posts] => edit_published_bills

	// Примітивні права, що використовуються в map_meta_cap()
	[create_posts] => edit_bills
)

Щоб переглянути, які права були створені, перегляньте глобальну змінну: $GLOBALS[‘wp_post_types’][‘bill’] .

Типово: “post”


capabilities
(масив)

Масив прав для цього запису.

Елемент масив виглядає як ключ => значение, де:

  • ключ– Звична назва права користувача.
  • значение– відповідне реальне право користувача, яке перевірятиметься з current_user_can() . Приклад такої перевірки:
    current_user_can( $post_type_object->cap->{ключ} )
    // При спрацьовуванні коду перетворитися на
    current_user_can( значення )

За замовчуванням доступні 8 елементів масиву, які визначають права для цього типу записів (навіть якщо map_meta_cap = false ), це:

  • edit_post, read_postі delete_post– 3 дозволи контролюючі редагування, прочитання та видалення конкретного запису. Це мета-права: не примітивні права, які вимагають обчислень на лету. Вони не записуються в список прав кожного користувача, а перетворюються на примітивні права на льоту за допомогою функції map_meta_cap() .
  • edit_posts– Контролює можливість редагувати об’єкти цього типу запису.
  • create_posts– аліас: те саме, що й право edit_posts .
  • edit_others_posts– Контролює можливість редагувати об’єкти цього типу записів, які належать іншому користувачеві. Якщо тип запису не підтримує авторів, поведінка цього аргументу буде схожа на edit_posts.
  • publish_posts– Контролює публікацію об’єктів цього типу запису.
  • read_private_posts– Контролює можливість прочитання особистих об’єктів (записів).

Примітивні права виду *_postsвикористовуються в двигуні в різних місцях.

Існує ще 8 примітивних прав, які не відносяться безпосередньо до ядра. Але відносяться до функції map_meta_cap() та перевіряються там. Вони встановлюються автоматично, якщо вказано параметр map_meta_cap = true:

  • read– дозволяє переглядати об’єкт у фронт-енді.
  • delete_posts– дозволяє видаляти об’єкт цього запису.
  • delete_private_posts– дозволяє видаляти особистий об’єкт цього запису.
  • delete_published_posts– дозволяє видаляти опубліковані об’єкти цього запису.
  • delete_others_posts– дозволяє видаляти записи, що належать іншим авторам. Якщо запис немає автора, то поведінка передається delete_posts.
  • edit_private_posts– дозволяє редагувати особисті записи.
  • edit_published_posts– дозволяє редагувати опубліковані записи.
  • create_posts– дозволяє створювати нові записи.

Примітка: Щоб користувач міг створювати нові записи, його роль повинна мати право ‘edit_posts’.

Цей параметр capabilities зазвичай встановлюється автоматично, спираючись на ‘capability_type’. Наприклад, якщо встановити ‘capability_type’ і ‘map_meta_cap’ і подивитися в змінну $GLOBALS[‘wp_post_types’][‘post_type’] , ми побачимо такий об’єкт:

[cap] => stdClass Object (
	// Мета можливості
	[edit_post] => "edit_{$capability_type}"
	[read_post] => "read_{$capability_type}"
	[delete_post] => "delete_{$capability_type}"

	// Примітивні права використовуються поза map_meta_cap():
	[edit_posts] => "edit_{$capability_type}s"
	[edit_others_posts] => "edit_others_{$capability_type}s"
	[publish_posts] => "publish_{$capability_type}s"
	[read_private_posts] => "read_private_{$capability_type}s"

	// Примітивні права використовують у map_meta_cap():
	[read] => "read",
	[delete_posts] => "delete_{$capability_type}s"
	[delete_private_posts] => "delete_private_{$capability_type}s"
	[delete_published_posts] => "delete_published_{$capability_type}s"
	[delete_others_posts] => "delete_others_{$capability_type}s"
	[edit_private_posts] => "edit_private_{$capability_type}s"
	[edit_published_posts] => "edit_published_{$capability_type}s"
	[create_posts] => "edit_{$capability_type}s"
)

Приклад нестандартного використання прав:

'capabilities' => array(
	'delete_posts' => 'edit_theme_options',
	'delete_post' => 'edit_theme_options',
	'delete_published_posts' => 'edit_theme_options',
	'delete_private_posts' => 'edit_theme_options',
	'delete_others_posts' => 'edit_theme_options',
	'edit_post' => 'edit_css',
	'edit_posts' => 'edit_css',
	'edit_others_posts' => 'edit_css',
	'edit_published_posts' => 'edit_css',
	'read_post' => 'read',
	'read_private_posts' => 'read',
	'publish_posts' => 'edit_theme_options',
),

За замовчуванням: використовується аргумент capability_type для створення списку дозволів


map_meta_cap
(логічний)

Ставимо true, щоб увімкнути дефолтний обробник спеціальних прав map_meta_cap() . Він перетворює неоднозначні права (edit_post – один користувач може, а інший ні) на примітивні (edit_posts – всі користувачі можуть). Зазвичай для типів постів цей параметр потрібно включати, якщо типу посту встановлюються спеціальні права (відмінні від ‘post’).

Примітка: якщо не встановити (залишити null), то логіка значення за замовчуванням розгалужується:

  • якщо в capability_type зазначено post або page і не вказано параметр capabilities , то map_meta_cap = true за промовчанням.
  • в інших випадках map_meta_cap = false за замовчуванням.

    // Шматок з коду: WP_Post_Type::set_props
    // Back compat with quirky handling in version 3.0. #14122.
    if ( empty( $args['capabilities'] ) && null === $args['map_meta_cap'] && in_array( $args['capability_type'], array( 'post', 'page' ) ) ) {
    	$args['map_meta_cap'] = true;
    }
    
    // If not set, default to false.
    if ( null === $args['map_meta_cap'] ) {
    	$args['map_meta_cap'] = false;
    }

Примітка: якщо встановити false, то стандартна роль “Адміністратор” не зможе редагувати цей тип запису. Для зняття такого обмеження доведеться додати право edit_{post_type}sна роль адміністратор.

Типово: null


hierarchical
(логічний)

Чи будуть записи цього типу мати деревоподібну структуру (як постійні сторінки).

true – так, будуть деревоподібними
false – ні, будуть пов’язані з таксономією (категоріями)

Типово: false


supports
(масив / false)

Поля/метобокси на сторінці створення/редагування типу запису.

Якщо в значенні вказати false, то ніякі додаткові метабокси виведені не будуть, у тому числі й ті, що встановлені за умовчанням.

  • title– Блок заголовка (за замовчуванням).
  • editor– блок введення контенту (за замовчуванням).
  • author– Блок вибору автора.
  • thumbnailблок вибору мініатюри запису. Потрібно також включити підтримку в установці теми post-thumbnails .
  • excerpt– Блок введення цитати.
  • trackbacks– включає підтримку трекбеків та пінгів (за блоки не відповідає);
  • custom-fields– блок встановлення довільних полів.
  • comments– Блок коментарів (обговорення).
  • revisions– блок ревізій (не відображається доки немає ревізій);
  • page-attributes– блок атрибутів сторінки: вибір шаблону ( він має бути створений ) та деревоподібний зв’язок записів (деревовидність повинна бути включена окремо ‘hierarchical’ => true ).

  • post-formats– блок форматів запису, якщо вони включені до теми.

Значення може бути зазначено у вигляді масиву, щоб передати додаткові параметри фітчі. Наприклад:

[
	'title',
	'editor',
	[ 'my_feature', [ 'field' => 'value' ]
]

Примітка: Якщо тип запису користувача використовує мініатюри, не забудьте перевірити, що тема також підтримує мініатюри або використовуйте функцію add_theme_support() .

За замовчуванням: array( ‘title’, ‘editor’ )


register_meta_box_cb
(рядок)
callback функція, яка буде спрацьовувати під час встановлення мета блоків для сторінки створення/редагування цього типу запису. Використовуйте
remove_meta_box()і
add_meta_box()в callback функції.


Типово: null’

taxonomies
(масив)

Масив зареєстрованих таксономій, які будуть пов’язані з цим типом записів, наприклад: categoryабо post_tag.

Зв’язати таксономії із записом можна пізніше через функцію register_taxonomy_for_object_type() .

Таксономію потрібно реєструвати за допомогою функції register_taxonomy() .

За замовчуванням: []

Індекс кінцевої точки, з якою буде асоційований тип запису, що створюється. Як правило, цей параметр не використовується. Тут можна зазначити слід. константи або їхню комбінацію з’єднану через & або | :

  • EP_NONE
  • EP_PERMALINK
  • EP_ATTACHMENT
  • EP_DATE
  • EP_YEAR
  • EP_MONTH
  • EP_DAY
  • EP_ROOT
  • EP_COMMENTS
  • EP_SEARCH
  • EP_CATEGORIES
  • EP_TAGS
  • EP_AUTHORS
  • EP_PAGES
  • EP_ALL

Кінцева точка – це те, що додається в кінець URL, наприклад /trackback/ . Кінцеві точки прикріплюються до типу запису (додаються до правил перезапису) за допомогою функції add_rewrite_endpoint() .

Цей параметр дозволяє вказати, яку групу кінцевих точок ми хочемо підключити до типу запису, що створюється (до URL запису). Наприклад, якщо вказати ‘permalink_epmask’ = EP_PAGES & EP_TAGS , наш тип запису буде мати всі додаткові варіанти URL (кінцеві точки), які передбачені для постійних сторінок і міток.

За умовчанням permalink_epmask = EP_PERMALINK – це означає, що до URL створюваного типу запису (у правила ЧПУ) будуть додані кінцеві точки, які додаються до звичайних записів WordPress: пагінація, сторінка коментів і т.д.

Якщо не потрібно додавати жодних кінцевих точок до нового типу запису, потрібно вказати EP_NONE . Або навпаки, вказуємо EP_ALL коли потрібно додати всі кінцеві точки.

За замовчуванням: EP_PERMALINK


has_archive
(рядок/логічний)

Увімкнути підтримку сторінок архівів для цього типу записів (пр. УРЛ запису виглядає так: example.com/type/post_name , тоді УРЛ архіву буде такий: example.com/type .

Якщо вказати рядок, то він буде використаний у ЧПУ. Наприклад, вкажемо тут typepageта отримаємо посилання на архів типу запису такого виду: example.com/typepage .
Файл цього архіву в темі матиме вигляд archive-type.php . Для архівів буде додано нове правило ЧПК, якщо аргумент rewriteвключено.
Типово: false


rewrite
(масив/логічний)

Чи використовувати ЧПК для цього запису. Щоб не використовувати ЧПУ, вкажіть false. За промовчанням: true — назва типу запису використовується як префікс у засланні. Можна в масиві вказати додаткові параметри для побудови ЧПУ:

  • slug (рядок)
    Префікс у ЧПУ ( /префікс/ярлик_запису ). Використовуйте [ 'slug' => $slug ]для створення іншого префікса.

    У цьому параметрі можна вказувати плейсхолдери типу %category%. Але вони повинні реєструватися окремо або їх потрібно створити за допомогою add_rewrite_tag() , щоб WP знав про них.
    Типово: назва типу запису

  • with_front (логічний)
    Чи потрібно вставляти загальний префікс з налаштувань. Префікс береться з $wp_rewite->front . Наприклад, якщо структура постійних посилань записів у налаштуваннях має вигляд blog/%postname%, то за false отримаємо: /news/название_поста, а за true отримаємо: /blog/news/название_поста.
    Типово: true

  • feeds (логічний)
    Додати правило ЧПУ для RSS стрічки цього типу запису.
    За промовчанням значення аргументу has_archive

  • pages (логічний)
    Додати правило ЧПУ для пагінації запису. Пр: /post_type/page/2. Тобто. якщо вказано true, то запис можна буде використовувати шоркод <!--nextpage-->. Дивіться wp_link_pages() .
    Типово: true

Типово: true (тип запису використовується як префікс)


query_var
(рядок/логічний)

Встановлює назву параметра запиту для типу запису, що створюється.

Ставимо false, щоб усунути можливість запитів.

  • false– Вимикає параметр запиту. Запис не буде доступний за URL: /?{query_var}={post_slug}.
  • string– Вказує назву параметра запиту. /?{query_var_string}={post_slug}.

Примітка: якщо publicly_queryable = falseі query_var = true, то при переході на URL-адресу запису ми побачимо головну сторінку УВАГА з кодом відповіді 200! Тому при відключенні запису від публічного перегляду, потрібно крім виставлення false для параметра public або publicly_queryable , потрібно також вказати false і для цього параметра – query_var = false, в цьому випадку при переході на URL запису ми, як і належить, побачимо 404 сторінку.

Примітка: параметр додає вказане значення або ярлик типу запису (якщо вказано true) до списку дозволених параметрів запиту WordPress, див add_rewrite_tag() . Тому що WordPress видаляє будь-які параметри запиту, які він не знає.

Приклад: ми реєструємо тип запису book і вказали рядок bookname в цьому параметрі . Тепер, пройде на сторінку книги за посиланням /book/harry-potter , в коді get_query_var(‘bookname’) , що обробляє цю сторінку , поверне harry-potter . А якби ми нічого не вказали в цьому параметрі (він був би true), то щоб отримати harry-potter нам потрібно було б використовувати get_query_var(‘book’) .

Типово: true – встановлюється аргумент$post_type


can_export
(логічний)
Можливість експорту цього записів.


Типово: true

delete_with_user
(логічний)
  • true– видаляти записи цього типу, що належать користувачеві при видаленні користувача. Якщо увімкнено кошик, записи не видалятимуться, а помістяться в кошик.
  • false– при видаленні користувача записи цього типу ніяк не будуть оброблятися.
  • null– записи видаляються або будуть переміщені в кошик, якщо post_type_supports(‘author’) встановлено. І не обробляться, якщо підтримки ‘author’ тип запису немає.

Типово: null


template
(масив) (WP 5.0.0)

Масив блоків, які будуть використані як початковий стан для редактора.

Кожен елемент повинен бути масивом, що містить ім’я блоку і необов’язкові атрибути.

Докладніше тут: https://developer.wordpress.org/block-editor/reference-guides/block-api/block-templates/

За замовчуванням: array()


template_lock
(логічний) (WP 5.0.0)

Чи потрібно блокувати шаблон блоку, якщо встановлено параметр template.

  • Якщо встановлено значення 'all', користувач не може вставляти нові блоки, переміщати існуючі блоки та видаляти блоки.
  • Якщо встановлено значення 'insert', користувач може переміщати існуючі блоки, але не може вставляти нові блоки та видаляти блоки.

cap
(stdClass)

Права типу запису. Встановлюється автоматично. Приклад значення коли cabability_type=post:

array(
	'edit_post' => 'edit_post',
	'read_post' => 'read_post',
	'delete_post' => 'delete_post',
	'edit_posts' => 'edit_posts',
	'edit_others_posts' => 'edit_others_posts',
	'delete_posts' => 'delete_posts',
	'publish_posts' => 'publish_posts',
	'read_private_posts' => 'read_private_posts',
	'read' => 'read',
	'delete_private_posts' => 'delete_private_posts',
	'delete_published_posts' => 'delete_published_posts',
	'delete_others_posts' => 'delete_others_posts',
	'edit_private_posts' => 'edit_private_posts',
	'edit_published_posts' => 'edit_published_posts',
	'create_posts' => 'edit_posts',
)

_builtin
(логічний)
Для внутрішнього користування! True, якщо це вбудований/внутрішній тип запису.


Типово: false
Для внутрішнього користування! Частина URL у посиланні на редагування цього типу запису.


За замовчуванням: ‘post.php?post=%d’

Приклади

1

#1 Додавання елемента таксономії до ЧПУ

Для нового типу запису можна вказати різні ЧПУ за допомогою параметра rewrite. Цей приклад показує, як додати до ЧПУ нового типу запису таксономію.

Допустимо, ми реєструємо типу запису catalogта таксономію productsдля нього. Далі, нам потрібно щоб при публікації запису та виборі для неї елемента таксономії. Цей елемент додавався в ЧПУ і в результаті посилання на тип запису виглядало так:
http://example.com/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.

Для деревоподібних таксономій

Для деревоподібних таксономій потрібно буде зібрати весь шлях, зробити це допоможе функція: get_term_parents_list()

//
$tax_slug = get_term_parents_list( $term_id, $tax_name, array(
	'separator' => '/',
	'format' => 'slug',
	'link' => false,
	'inclusive' => true,
)));

Також важливо, щоб при реге типу запису, параметр hierarchical був false !

1

#2 Додавання таксономії до ЧПУ (у запису та такси однаковий префікс)

Цей приклад показує як створити запис типу faq (запитання) та розділи для неї (таксономію faqcat ). При цьому префікс у ЧПУ у таксономії буде такий самий, як у типу запису:

  • У запису: example.com/faq/{категорія}/{ярлик-запису}
  • Такса: example.com/faq/{категорія}

Тут важливо спочатку регнути таксу, а потім тип запису:

add_action( 'init', 'register_faq_post_type' );
function register_faq_post_type() {

	// Розділ питання – faqcat
	register_taxonomy( 'faqcat', [ 'faq' ], [
		'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', [
		'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 ){

	// виходимо якщо це наш тип записи: без холдера %faqcat%
	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 );
}

0

#3 Реєстрація нового типу запису

Приклад реєстрації довільного типу записів “book”. Також у прикладі показано, як увімкнути повідомлення при оновленні та підтримці розділу допомоги.

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_filter('post_updated_messages', 'book_updated_messages');
function book_updated_messages( $messages ) {
	global $post;

	$messages['book'] = array(
		0 => '', // Не використовується. Повідомлення використовуються з індексу 1.
		1 => sprintf( 'Book оновлено. <a href="%s">Подивитися запис book</a>', esc_url( get_permalink($post->ID) ) ),
		2 => 'Довільне поле оновлено.',
		3 => 'Довільне поле видалено.',
		4 => 'Запис Book оновлено.',
		/* %s: дата та час ревізії */
		5 => isset($_GET['revision']) ? sprintf( 'Запис Book відновлено з ревізії %s', wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
		6 => sprintf( 'Запис Book опубліковано. <a href="%s">Перейти до запису book</a>', esc_url( get_permalink($post->ID) ) ),
		7 => 'Запис Book збережено.',
		8 => sprintf( 'Запис Book збережено. <a target="_blank" href="%s">Перегляд запису book</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post- >ID) ) ) ),
		9 => sprintf( 'Запис Book запланований на: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Перегляд запису book</a>',
		  // Як форматувати дати в PHP можна подивитися тут: http://php.net/date
		  date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post->ID) ) ),
		10 => sprintf( 'Чернетка запису Book оновлена. <a target="_blank" href="%s">Перегляд запису book</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post) -> ID))))),
	);

	return $messages;
}

Розділ “допомога” типу запису 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;
}

нотатки

Плагін для регi типу запису

Є зручний плагін, який дозволяє реєструвати нові типи записів (постів) та нові таксономії: Custom Post Type UI

Перейменування заголовків типу запису

Якщо тип запису вже зареєстрований, але нам потрібно назвати його інакше, використовуйте наступний код.

Цей код показує, як перейменувати стандартний тип запису “Записи” на “Статті”:

## замінимо слово «записи» на «статті»
//$labels = apply_filters("post_type_labels_{$post_type}", $labels);
add_filter('post_type_labels_post', 'rename_posts_labels');
function rename_posts_labels( $labels ){
	// замінювати автоматично не піде наприклад замінили: Запис = Стаття, а в тесті вийде так "Переглянути статтю"

	/* оригінал
		stdClass Object (
			'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' => '',
			'all_items' => 'Всі записи',
			'archives' => 'Архіви записів',
			'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_admin_bar' => 'Запис',
		)
	*/

	$new = 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' => '',
		'all_items' => 'Всі статті',
		'archives' => 'Архіви статей',
		'insert_into_item' => 'Вставити до статті',
		'uploaded_to_this_item' => 'Завантажені для цієї статті',
		'featured_image' => 'Мініатюра статті',
		'filter_items_list' => 'Фільтрувати список статей',
		'items_list_navigation' => 'Навігація за списком статей',
		'items_list' => 'Список статей',
		'menu_name' => 'Статті',
		'name_admin_bar' => 'Статтю', // пункті "додати"
	);

	return (object) array_merge((array) $labels, $new);
}

Детальніше читайте у питанні .

Дуже дешеві, але якісні передплатники в Інстаграмі доступні за адресою https://doctorsmm.com/ . Тут Ви зможете знайти будь-яку пропозицію персонально для Вашого облікового запису. На сайті представлено широке розмаїття якості сторінок, що додаються, і швидкісний режим, а також діє таргетування аудиторії за географічною ознакою.

нотатки

  • Global. Масив. $wp_post_types List of post types.

список змін

З версії 2.9.0Введено.
З версії 3.0.0The show_ui argument is now enforced on the new post screen.
З версії 4.4.0The show_ui argument is now enforced on the post type listing screen and post editing screen.
З версії 4.6.0Post type object returned is now instance of WP_Post_Type .
З версії 4.7.0Introduced show_in_rest , rest_base and rest_controller_class arguments до register the post type в API REST.
З версії 5.0.0The template and template_lock arguments були added.
З версії 5.3.0Спосіб argument є невід’ємною мірою, коли зв’язок arguments for feature.
З версії 5.9.0Rest_namespace argument був added.

register post type WP 6.0.2

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 = новий 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` об'єкт.
	 *
	 * @param string $post_type Post type.
	 * @param WP_Post_Type $post_type_object Arguments використовується для register the post type.
	 */
	do_action( 'registered_post_type', $post_type, $post_type_object );

	/**
	 * Fires after a specific post type is registered.
	 *
	 * The dynamic portion of filter name, `$post_type`, refers to the post type key.
	 *
	 * Possible hook names include:
	 *
	 * - `registered_post_type_post`
	 * - `registered_post_type_page`
	 *
	 * @ Since 6.0.0
	 *
	 * @param string $post_type Post type.
	 * @param WP_Post_Type $post_type_object Arguments використовується для register the post type.
	 */
	do_action( "registered_post_type_{$post_type}", $post_type, $post_type_object );

	return $post_type_object;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *