Произвольный тип записи
Оригинальное название: custom post type
Коротко
Собственный тип содержимого, который разработчик регистрирует в дополнение к записям и страницам: услуги, проекты портфолио, вакансии, мероприятия, товары.
Что такое «Произвольный тип записи»
Встроенных типов два основных — записи для блога и страницы для постоянных разделов. Когда на сайте появляется каталог однотипных объектов со своими полями, отдельным разделом в админке и своим архивом, его оформляют произвольным типом. Так у вакансий будет пункт меню «Вакансии», свой адрес /vacancies/, отдельный шаблон и поля «зарплата» и «график», а в общий блог они не попадут.
Технически все типы хранятся в одной таблице wp_posts и различаются колонкой post_type. Поэтому новый тип сразу получает статусы, корзину и поиск, а ревизии, отрывок и миниатюру включают списком в параметре supports. О встроенных типах подробнее на странице тип записи.
Пример регистрации
add_action( 'init', function () {
register_post_type( 'vacancy', [
'labels' => [ 'name' => 'Вакансии', 'singular_name' => 'Вакансия' ],
'public' => true,
'has_archive' => true,
'rewrite' => [ 'slug' => 'vacancies' ],
'menu_icon' => 'dashicons-businessman',
'supports' => [ 'title', 'editor', 'thumbnail', 'excerpt' ],
'show_in_rest' => true,
] );
} );
Параметр show_in_rest нужен для редактора блоков: без него тип откроется в классическом редакторе. После регистрации один раз пересохраняют постоянные ссылки, иначе новые адреса будут отдавать 404.
Шаблоны вывода
По иерархии шаблонов WordPress сначала ищет файлы single-vacancy.php для отдельной вакансии и archive-vacancy.php для списка, а если их нет — берёт общие single.php и archive.php. В блочной теме те же шаблоны создают в редакторе сайта.
Ошибки при создании
- Тип объявлен в
functions.phpтемы. При смене темы раздел исчезнет из админки, хотя записи останутся в базе. Регистрировать тип надёжнее в плагине. - Неподходящее имя. Оно должно быть не длиннее 20 символов и состоять из строчных латинских букв, цифр, дефисов и подчёркиваний — более длинное WordPress не зарегистрирует. Зарезервированные имена вроде
post,page,action,order,themeконфликтуют с ядром, их не используют. - Имя типа поменяли после наполнения. Записи не переезжают автоматически: их
post_typeв базе остаётся старым, и раздел выглядит пустым.
Типы записей, поля и шаблоны дешевле продумать до наполнения, чем переделывать готовый раздел: это одна из первых задач при разработке сайта на WordPress.

