Если на сайте нужно отдельно вести портфолио, кейсы, отзывы, вакансии или каталог объектов, обычных записей и страниц быстро становится недостаточно. В таких случаях удобнее создать пользовательский тип записей, или CPT (Custom Post Type). Это отдельный тип контента со своей структурой в админке, отдельным архивом и собственными настройками отображения.
Самый надёжный способ — зарегистрировать CPT кодом. Плагины тоже умеют это делать, но для рабочей темы или проекта с долгим сроком жизни код обычно предсказуемее: вы контролируете названия, права доступа, URL и поведение архива. Ниже разберём именно этот вариант, без таксономий и REST API.
Когда пользовательский тип записей действительно нужен
CPT стоит создавать, когда контент отличается от обычных записей не только названием, но и логикой. Например, у портфолио есть изображение, краткое описание, ссылка на проект и статус; у вакансии — город, зарплата и тип занятости; у объекта недвижимости — площадь, адрес и цена. Если вы просто хотите добавить ещё одну рубрику или несколько меток, CPT не нужен: для этого достаточно таксономий или стандартных записей.
Хороший ориентир простой: если контент должен жить отдельно в админке, иметь свой архив и не смешиваться с новостями блога, значит CPT уместен. Если же различие только в теме публикации, лучше не усложнять структуру сайта.
Где регистрировать CPT, чтобы он не пропал после обновления
Частая ошибка — добавить код в файл темы и забыть, что при смене темы тип записей исчезнет. Если CPT нужен надолго, лучше вынести регистрацию в дочернюю тему или в небольшой плагин. Для проекта, который может менять оформление, плагин надёжнее: контент останется доступным независимо от темы.
Если вы всё же работаете в теме, используйте functions.php дочерней темы, а не родительской. Иначе любое обновление темы может затереть изменения.
Базовая регистрация пользовательского типа записей
Для создания CPT используется функция register_post_type(). Её вызывают на хуке init. Ниже рабочий пример для типа записей portfolio — портфолио.
Перед добавлением кода сделайте резервную копию файлов, если правите тему вручную. Ошибка в PHP может временно сломать сайт или админку.
<?php
add_action( 'init', 'wpmake_register_portfolio_cpt' );
function wpmake_register_portfolio_cpt() {
$labels = array(
'name' => 'Портфолио',
'singular_name' => 'Проект',
'add_new' => 'Добавить проект',
'add_new_item' => 'Добавить новый проект',
'edit_item' => 'Редактировать проект',
'new_item' => 'Новый проект',
'view_item' => 'Просмотреть проект',
'search_items' => 'Искать проекты',
'not_found' => 'Проекты не найдены',
'not_found_in_trash' => 'В корзине проектов нет',
'menu_name' => 'Портфолио',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_rest' => false,
'query_var' => true,
'rewrite' => array( 'slug' => 'portfolio' ),
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => 20,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields' ),
);
register_post_type( 'portfolio', $args );
}Здесь важны несколько параметров. public делает тип записей доступным на сайте и в админке. has_archive включает архивную страницу, например /portfolio/. rewrite задаёт красивый URL. supports определяет, какие блоки редактирования будут доступны в админке.
Если вам не нужны произвольные поля, уберите custom-fields. Если нужен только заголовок и редактор, оставьте минимум: title и editor.
Какие параметры стоит настроить сразу
На практике чаще всего приходится менять не сам факт регистрации, а поведение CPT. Вот параметры, на которые стоит смотреть в первую очередь.
has_archive— нужен ли архивный список записей.rewrite— какой будет URL у одиночной записи и архива.supports— какие поля и метабоксы видны в редакторе.menu_icon— иконка в админ-меню, если нужен более понятный интерфейс.show_in_rest— включать ли поддержку блокового редактора и REST API. Для обычной работы с CPT это не обязательно, но если вы используете редактор Gutenberg, обычно значение должно бытьtrue.
Если сайт уже работает на блоковом редакторе, а CPT не открывается в нём как надо, сначала проверьте именно show_in_rest. Без этого WordPress может показывать классический интерфейс или ограниченный редактор, в зависимости от конфигурации.
Как сделать CPT удобным для админки
Пользовательский тип записей создают не только ради URL, но и ради удобства работы в админке. Поэтому имеет смысл сразу продумать названия и набор полей. Для портфолио обычно достаточно заголовка, изображения записи, краткого описания и основного текста. Для вакансий часто добавляют город, зарплату и тип занятости уже отдельными полями — но это следующий шаг, не обязательный для самой регистрации CPT.
Если тип записей должен быть заметным в меню, задайте menu_icon. Например, можно использовать Dashicons, встроенные в WordPress. Это не влияет на работу CPT, но помогает быстрее ориентироваться в панели.
Ещё один практический момент: не называйте CPT слишком общо. Вместо абстрактного items лучше использовать понятное имя вроде vacancies, cases или objects. Это упростит поддержку кода и уменьшит путаницу при дальнейшем развитии сайта.
Что делать после добавления кода
После сохранения кода зайдите в админку WordPress и проверьте, появился ли новый пункт меню. Затем откройте Настройки → Постоянные ссылки и просто нажмите кнопку сохранения без изменения полей. Это обновит правила перезаписи URL. Без этого архив и одиночные страницы CPT иногда дают 404, хотя сам тип записей уже зарегистрирован.
Дальше создайте тестовую запись и проверьте три вещи: открывается ли запись по ссылке, работает ли архив, и не конфликтует ли slug с уже существующей страницей или записью. Если вы задали rewrite как portfolio, не должно быть страницы с таким же адресом.
Если CPT не появился или открывается с ошибкой 404
Когда пользовательский тип записей не виден в админке, обычно проблема в одном из трёх мест: код не загружается, в нём синтаксическая ошибка или регистрация выполняется не на том хуке. Проверьте, что функция действительно подключена и вызывается на init.
Если записи создаются, но архив или одиночная страница дают 404, почти всегда помогает повторное сохранение постоянных ссылок. Если не помогло, проверьте значение rewrite и отсутствие конфликта с уже существующим URL. Конфликт может возникать не только со страницей, но и с другим CPT или таксономией, если у них одинаковый slug.
Ещё одна типичная ситуация — CPT зарегистрирован, но не отображается в списке записей в админке так, как вы ожидаете. Это нормально: пользовательский тип записей живёт отдельно от обычных постов. Если нужен единый список, его придётся настраивать отдельно, но это уже не задача регистрации CPT.
Как понять, что всё настроено правильно
Проверка занимает пару минут и избавляет от скрытых проблем. Откройте админку и убедитесь, что:
- в меню появился отдельный раздел CPT;
- можно добавить новую запись этого типа;
- страница записи открывается без 404;
- архив CPT доступен по нужному адресу;
- в редакторе видны только те поля, которые вы указали в
supports.
Если всё это работает, CPT зарегистрирован корректно. Дальше можно уже добавлять метабоксы, произвольные поля, шаблоны архива и одиночной записи, но базовая задача — отдельный тип контента — уже решена.
Для большинства проектов этого достаточно, чтобы аккуратно отделить портфолио, кейсы, отзывы, вакансии или каталог объектов от обычных записей блога и не смешивать разные типы контента в одной ленте.