
💡 Как создать пользовательский тип записи в WordPress: код и плагин
Стандартные «Записи» и «Страницы» закрывают большинство задач обычного сайта. Но когда появляется каталог товаров, база недвижимости или портфолио проектов, этих двух типов контента уже не хватает. Смешивать товары с черновиками блога неудобно, а перегружать страницы произвольными полями, путь к хаосу в админке.
WordPress решает эту задачу через пользовательские типы записей, Custom Post Types (CPT). Вы создаете отдельный раздел в боковом меню, со своими полями, рубриками и шаблонами вывода. Товары живут отдельно от статей. События не путаются со страницами. Данные остаются там, где им место.
Ниже, два протестированных способа: через код на register_post_type() (гибко, ноль лишних плагинов) и через бесплатный плагин CPT UI (ни строчки PHP). Оба работают на WordPress 6.7+ и проверены на боевых сайтах.
💡 Быстрый обзор:
- Регистрируете новый тип записи через функцию ядра
register_post_type(), без плагинов, полный контроль над параметрами. - Альтернатива без кода: плагин Custom Post Type UI дает визуальный интерфейс, снижает порог входа и исключает ошибки синтаксиса.
- После регистрации тип появляется в боковом меню. Финальный штрих, таксономии, поля и сброс пермалинков.
Что такое пользовательский тип записи
Любой контент в WordPress, это запись с полем post_type в таблице wp_posts. У постов блога, post. У страниц, page. У вложений, attachment. Пользовательский тип добавляет еще одно значение: product для товаров, event для событий, portfolio для проектов. Любое, под задачу сайта.
Каждый CPT получает собственный пункт в админке, структуру URL (/events/webinar-2026/), свои таксономии и поддержку нужных блоков редактора: миниатюры, выдержки, редактор, комментарии. Все это включается галочками в массиве supports, никакой магии.
Главный выигрыш, порядок. Товары не болтаются в ленте блога. События не нужно вычленять фильтром из общей кучи. Администрирование ускоряется, поиск по сайту работает точнее.
Способ 1: регистрация через код, register_post_type()
Базовый метод, который работает с WordPress 3.0. Никаких сторонних плагинов. Код размещается в functions.php дочерней темы или, безопаснее, через плагин Code Snippets: ошибка в коде не положит сайт, а просто отключит конкретный сниппет.
Шаг 1: функция на хуке init
Функция вешается на хук init. Раньше нельзя, ядро еще не готово принимать регистрации. Позже, тип не подхватится до следующего запроса. Вот минимальный рабочий каркас:
1 /** 2 * Регистрирует пользовательский тип записи «Книги». 3 * Разместите в functions.php дочерней темы или через Code Snippets. 4 */ 5 function myprefix_register_book_post_type() { 6 register_post_type( 'book', array( 7 'labels' => array( 8 'name' => 'Книги', 9 'singular_name' => 'Книга', 10 'add_new_item' => 'Добавить книгу', 11 'edit_item' => 'Редактировать книгу', 12 'view_item' => 'Смотреть книгу', 13 'search_items' => 'Искать книги', 14 'not_found' => 'Книг не найдено', 15 ), 16 'public' => true, 17 'has_archive' => true, 18 'rewrite' => array( 'slug' => 'books' ), 19 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ), 20 'show_in_rest' => true, 21 'menu_icon' => 'dashicons-book-alt', 22 ) ); 23 } 24 add_action( 'init', 'myprefix_register_book_post_type' );
После вставки кода в админке появляется раздел «Книги». URL записей, site.ru/books/название-книги/. Работает сразу.
Шаг 2: ключевые параметры
Функция принимает два аргумента: строку-ключ типа (до 20 символов, латиница и дефисы) и массив настроек. Вот параметры, которые стоит осознанно настроить:
Параметр | Что делает | Рекомендация |
|---|---|---|
| Видимость в админке и на фронте |
|
| Страница-архив всех записей типа |
|
| Структура URL (slug) | Задайте явно, без спецсимволов |
| Блоки редактора | Минимум: |
| Доступность в блочном редакторе |
|
| Иконка в боковом меню | Выберите из Dashicons |
Шаг 3: таксономии
Категории и метки постов по умолчанию не привязаны к вашему CPT. Создайте собственные:
1 function myprefix_register_book_taxonomies() { 2 register_taxonomy( 'genre', 'book', array( 3 'label' => 'Жанры', 4 'rewrite' => array( 'slug' => 'genre' ), 5 'hierarchical' => true, 6 'show_in_rest' => true, 7 ) ); 8 9 register_taxonomy( 'book_tag', 'book', array( 10 'label' => 'Метки книг', 11 'rewrite' => array( 'slug' => 'book-tag' ), 12 'hierarchical' => false, 13 'show_in_rest' => true, 14 ) ); 15 } 16 add_action( 'init', 'myprefix_register_book_taxonomies' );
Таксономии регистрируются через register_taxonomy() с явной привязкой к post_type вторым параметром. hierarchical => true дает древовидную структуру как у категорий. false, плоский список как у меток.
Шаг 4: сброс пермалинков
После регистрации зайдите в Настройки → Постоянные ссылки и нажмите «Сохранить изменения», даже если ничего не меняли. WordPress пересоберет правила маршрутизации. Без этого шага URL вроде /books/ будут отдавать 404.
Когда кода достаточно
Метод хорош для одного-двух кастомных типов, когда структура не меняется часто. Плюс: ноль лишних плагинов и полный контроль над каждым параметром. Минус: для сложных связей между несколькими CPT и фронтовых форм отправки код быстро разрастается.
Способ 2: без кода, плагин Custom Post Type UI
Если заходить в functions.php не хочется, ставьте Custom Post Type UI. Бесплатный плагин от WebDevStudios: миллион активных установок, рейтинг 4,6 на WordPress.org. Обновлен в мае 2026, протестирован вплоть до WP 7.0.

Как создать CPT через интерфейс
- Установите плагин: Плагины → Добавить новый → «Custom Post Type UI» → Установить → Активировать.
- Перейдите в CPT UI → Add/Edit Post Types.
- Заполните поля: Post Type Slug (латиница, например
event), Plural Label («События»), Singular Label («Событие»). - В блоке Settings отметьте: Public (True), Has Archive (True), Show in REST API (True).
- В блоке Supports отметьте минимум: Title, Editor, Thumbnail, Excerpt.
- Нажмите Add Post Type.
Таксономии создаются там же, на вкладке Add/Edit Taxonomies. Укажите привязку к вашему типу записи, рубрики появятся в боковом меню.
Сильные стороны
Быстрая регистрация без риска синтаксической ошибки: плагин сам собирает корректный массив $args. Вкладка Tools дает миграцию типов между сайтами через экспорт и импорт кода. CPT UI Pro добавляет блоки для фронтового вывода и drag-and-drop колонок в админке, но бесплатная версия полностью закрывает задачу регистрации.
Обратите внимание: плагин только регистрирует типы и таксономии. Для вывода на фронте потребуются либо шаблоны в теме, либо CPT UI Pro, либо связка с Advanced Custom Fields или Elementor.
Сравнение: код против плагина
Критерий | Код ( | Плагин (CPT UI) |
|---|---|---|
Порог входа | Нужно понимание PHP-массива | Интерфейс как у стандартных настроек WP |
Количество CPT | Не ограничено | Не ограничено |
Перенос между сайтами | Копирование кода | Экспорт/импорт через Tools |
Лишний код на сайте | Нет | Плюс один плагин |
Зависимость от плагина | Нет | Есть, CPT UI должен быть активен |
Документация |
На практике часто комбинируют: регистрируют типы через CPT UI для скорости, а поля добавляют через Advanced Custom Fields. Получается визуальный интерфейс настройки без единой строки PHP.
⁉️🤔 Частые вопросы
Нужно ли сбрасывать пермалинки после создания CPT?
Да, обязательно. Зайдите в Настройки → Постоянные ссылки и нажмите «Сохранить». WordPress пересоберет правила маршрутизации. Без этого новые URL вроде
/books/будут возвращать 404.
Чем CPT UI отличается от ACF в регистрации типов?
CPT UI только регистрирует тип записи и таксономии. ACF, начиная с версии 6.1, тоже умеет регистрировать CPT, но его главная сила, пользовательские поля. Связка CPT UI + ACF дает интерфейс для типов и гибкие поля. Вы не привязаны к одному вендору.
Можно ли переименовать существующий тип записи?
Прямого механизма нет. При смене
post_typeв базе старые записи пропадают из админки. Правильный путь: создать новый тип с нужным именем, перенести записи SQL-запросомUPDATE wp_posts SET post_type = 'new_type' WHERE post_type = 'old_type', и только потом удалить старую регистрацию. Полный бэкап базы перед миграцией обязателен.
Исчезнут ли кастомные типы при смене темы?
Если типы зарегистрированы в
functions.phpтемы, да, при смене темы они пропадут из админки. Записи останутся в базе, но не будут видны. Регистрируйте CPT в отдельном плагине или через Code Snippets, тогда типы переживут любую смену темы.
Как вывести CPT на главную в общую ленту?
Добавьте фильтр в Code Snippets:
add_filter( 'pre_get_posts', function( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } );. Подставьте свойpost_typeв массив, записи появятся в ленте рядом с обычными постами.
Какой способ выбрать: итоговый расклад
Оба метода ведут к одному результату: в боковом меню появляется новый раздел, готовый к наполнению. Разница только в инструменте.
Работаете с сайтом руками и не боитесь functions.php, берите код. Одна функция register_post_type(), ноль лишних плагинов. Подходит для лендингов, небольших каталогов и проектов с техподдержкой разработчика.
Передаете сайт клиенту или собираете контент-проект на десятке типов, ставьте CPT UI. Визуальный интерфейс снижает порог входа, а экспорт конфигурации экономит часы при переезде между площадками.
В любом случае после регистрации настройте вывод: шаблоны single и archive в теме или визуальную верстку через CPT UI Pro / Elementor Pro. Без этого шага контент останется только в админке.



