Skip to content

Всё для WordPress, веб-разработки — и не только

💡 Как создать пользовательский тип записи в WordPress: код и плагин

💡 Как создать пользовательский тип записи в 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 */
5function 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}
24add_action( 'init', 'myprefix_register_book_post_type' );

После вставки кода в админке появляется раздел «Книги». URL записей, site.ru/books/название-книги/. Работает сразу.

Шаг 2: ключевые параметры

Функция принимает два аргумента: строку-ключ типа (до 20 символов, латиница и дефисы) и массив настроек. Вот параметры, которые стоит осознанно настроить:

Параметр

Что делает

Рекомендация

public

Видимость в админке и на фронте

true для большинства случаев

has_archive

Страница-архив всех записей типа

true для каталогов и подборок

rewrite

Структура URL (slug)

Задайте явно, без спецсимволов

supports

Блоки редактора

Минимум: title editor thumbnail

show_in_rest

Доступность в блочном редакторе

true обязательно, иначе Gutenberg не откроется

menu_icon

Иконка в боковом меню

Выберите из Dashicons

Шаг 3: таксономии

Категории и метки постов по умолчанию не привязаны к вашему CPT. Создайте собственные:

1function 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}
16add_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 UI

Как создать 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.

Сравнение: код против плагина

Критерий

Код (register_post_type)

Плагин (CPT UI)

Порог входа

Нужно понимание PHP-массива

Интерфейс как у стандартных настроек WP

Количество CPT

Не ограничено

Не ограничено

Перенос между сайтами

Копирование кода

Экспорт/импорт через Tools

Лишний код на сайте

Нет

Плюс один плагин

Зависимость от плагина

Нет

Есть, CPT UI должен быть активен

Документация

developer.wordpress.org

docs.pluginize.com

На практике часто комбинируют: регистрируют типы через 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. Без этого шага контент останется только в админке.