register_post_type()
Створює новий тип запису або змінює наявний.
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
(масив) Масив містить у собі назви ярликів для типу запису.
Для невстановлених рядків (тобто за умовчанням) будуть використані:
- Для не деревоподібних типів записів – назви “постів”.
- Для деревоподібних типів записів – назви “постійних сторінок”.
У масиві можна зазначити такі аргументи:
Для повного списку значень див. 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)
-
exclude_from_search
(логічний) Чи виключити цей тип записів із пошуку по сайту. 1 (true) – так, 0 (false) – ні.
Якщо цей параметр встановлений в
true
, то для термінів таксономій прив’язаних до цього типу записів, висновок не працюватиме (нехай навіть параметр public дорівнює true). Тобто. цей тип постів буде повністю виключений із запитів типуquery_posts()
!За замовчуванням: обернене значення аргументу public
-
show_ui
(логічний) Визначає, чи потрібно створювати логіку управління типом запису з адмін-панелі. Чи потрібно створювати UI типу запису, щоб можна було керувати.
Так, наприклад, якщо вказати true , а show_in_menu = false . То ми матимемо можливість зайти сторінку управління типом записи, тобто. двигун розумітиме і оброблятиме такі запити, але посилання на цю сторінку в меню не буде …
За промовчанням значення аргументу public
Чи показувати тип запису в адміністраторському меню і де саме показувати керування типом запису. Аргумент 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) -
Увімкнути можливість вибирати цей тип запису у меню навігації.
Типово: значення параметра 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() .
За замовчуванням: []
-
permalink_epmask
(рядок) Індекс кінцевої точки, з якою буде асоційований тип запису, що створюється. Як правило, цей параметр не використовується. Тут можна зазначити слід. константи або їхню комбінацію з’єднану через & або | :
- 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/название_поста
.
Типово: truefeeds (логічний)
Додати правило ЧПУ для 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 -
_edit_link
(рядок) -
Для внутрішнього користування! Частина URL у посиланні на редагування цього типу запису.
За замовчуванням: ‘post.php?post=%d’
Приклади
#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 !
#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 ); }
#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
Перейменування заголовків типу запису
Якщо тип запису вже зареєстрований, але нам потрібно назвати його інакше, використовуйте наступний код.
Цей код показує, як перейменувати стандартний тип запису “Записи” на “Статті”:
Детальніше читайте у питанні .
–
Дуже дешеві, але якісні передплатники в Інстаграмі доступні за адресою https://doctorsmm.com/ . Тут Ви зможете знайти будь-яку пропозицію персонально для Вашого облікового запису. На сайті представлено широке розмаїття якості сторінок, що додаються, і швидкісний режим, а також діє таргетування аудиторії за географічною ознакою.
нотатки
- Global. Масив. $wp_post_types List of post types.
список змін
З версії 2.9.0 | Введено. |
З версії 3.0.0 | The show_ui argument is now enforced on the new post screen. |
З версії 4.4.0 | The show_ui argument is now enforced on the post type listing screen and post editing screen. |
З версії 4.6.0 | Post type object returned is now instance of WP_Post_Type . |
З версії 4.7.0 | Introduced show_in_rest , rest_base and rest_controller_class arguments до register the post type в API REST. |
З версії 5.0.0 | The template and template_lock arguments були added. |
З версії 5.3.0 | Спосіб argument є невід’ємною мірою, коли зв’язок arguments for feature. |
З версії 5.9.0 | Rest_namespace argument був added. |