Как создать собственный тип записей в WordPress

Если на сайте появляются не только обычные записи и страницы, а ещё кейсы, портфолио, вакансии, объекты каталога или отзывы, стандартных типов контента WordPress быстро становится мало. В таких случаях нужен собственный тип записей, или custom post type. Он позволяет хранить отдельную сущность отдельно от обычных постов, задавать ей свой URL, архив, поля и логику отображения.

На практике это не «сложная разработка ради разработки», а нормальный способ не смешивать разные виды контента в одной ленте. Ниже разберём, когда custom post type действительно нужен, как создать его без лишних рисков и что проверить после настройки.

Когда собственный тип записей действительно нужен

Custom post type стоит делать тогда, когда у сущности есть собственная структура и она живёт отдельно от блога. Типичные примеры:

  • портфолио с названием, описанием, галереей и результатом работы;
  • кейсы с этапами, задачей и итогом;
  • каталог объектов, где у каждой карточки есть адрес, цена, характеристики;
  • вакансии с зарплатой, городом и сроком отклика;
  • отзывы, если они должны выводиться отдельным разделом, а не в обычных записях.

Если же вам нужно просто добавить пару дополнительных полей к обычной статье, custom post type не нужен. В таком случае чаще достаточно произвольных полей, блоков или отдельной таксономии. CPT оправдан, когда контент должен иметь:

  • свой архивный раздел;
  • свои шаблоны вывода;
  • собственные категории или теги;
  • отдельную логику в админке и на сайте.

Какой способ создания выбрать: код или плагин

Есть два рабочих пути: зарегистрировать тип записей кодом в теме или плагине, либо использовать плагин-конструктор. Для боевого сайта я обычно советую код, если тип записей нужен надолго и логика должна быть под контролем. Плагин удобен для быстрого старта, но добавляет зависимость от стороннего решения.

СпособКогда подходитПлюсыМинусы
КодНужна стабильная структура и контрольНе зависит от интерфейса плагина, проще поддерживать в проектеНужно редактировать код и понимать, где он хранится
ПлагинНужно быстро собрать прототип или нет доступа к кодуМожно настроить без разработкиЗависимость от плагина, иногда сложнее переносить проект

Если тип записей важен для сайта надолго, лучше вынести регистрацию в собственный мини-плагин или в функциональность дочерней темы. Не стоит привязывать CPT к родительской теме, если есть риск её смены: при переключении темы тип записей может пропасть из админки, а контент останется в базе без нормального отображения.

Создание custom post type кодом

Самый надёжный вариант — зарегистрировать тип записей через функцию register_post_type(). Делать это нужно на хуке init. Для примера создадим тип записей portfolio с названием «Портфолио».

Ниже рабочий минимальный пример. Его можно добавить в мини-плагин или в файл functions.php дочерней темы, но для постоянного проекта плагин безопаснее.

add_action( 'init', 'wptasks_register_portfolio_cpt' );

function wptasks_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'       => true,
		'supports'           => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
		'rewrite'            => array( 'slug' => 'portfolio' ),
		'menu_position'      => 20,
		'menu_icon'          => 'dashicons-portfolio',
	);

	register_post_type( 'portfolio', $args );
}

Что здесь важно:

  • portfolio — внутренний идентификатор типа записей. Он должен быть коротким, латиницей и без пробелов.
  • labels отвечает за подписи в админке.
  • supports определяет, какие возможности будут доступны в редакторе: заголовок, контент, миниатюра, краткое описание.
  • show_in_rest нужен, если вы используете редактор блоков и хотите, чтобы тип корректно работал в REST API и в современном редакторе WordPress.
  • rewrite задаёт красивый URL-слуг.

Если вам не нужен архив, можно поставить has_archive в false. Если тип должен быть доступен только внутри админки или не должен открываться по прямой ссылке, набор аргументов будет другим. Но для каталога, портфолио и похожих сущностей обычно нужен именно публичный тип.

Как добавить таксономии и отдельные поля

Один только CPT редко решает задачу полностью. Обычно к нему добавляют таксономии — например, категории проектов, типы услуг или города. Для этого используется register_taxonomy(). Принцип тот же: регистрируете таксономию на init и привязываете её к нужному типу записей.

Если нужны дополнительные данные вроде цены, даты сдачи, ссылки на проект или статус, используйте произвольные поля. В WordPress это можно сделать через метабоксы, ACF или другие решения. Для простого сайта не обязательно усложнять всё с самого начала: сначала определите, какие данные реально нужны в карточке, а какие можно вывести из заголовка и текста.

Практическое правило простое: если поле влияет на фильтрацию, сортировку или отдельный шаблон, его лучше хранить структурированно. Если это просто пояснение для редактора, иногда достаточно обычного текста в описании.

Что сделать после регистрации типа записей

После добавления кода новый раздел обычно появляется в админке сразу, но URL могут не заработать с первого раза. Это нормальная ситуация: WordPress хранит правила перезаписи отдельно. После регистрации CPT нужно обновить постоянные ссылки.

Сделать это можно так:

  1. Откройте Настройки → Постоянные ссылки в админке.
  2. Ничего не меняя, нажмите кнопку сохранения.
  3. Проверьте, открываются ли страницы типа /portfolio/ и отдельные записи.

Этот шаг часто забывают, из-за чего на новом типе записей видят 404, хотя сам код написан правильно.

Дальше проверьте ещё три вещи:

  • есть ли новый пункт меню в админке;
  • создаются ли записи без ошибок;
  • открывается ли архив, если он включён.

Как вывести собственный тип записей на сайте

Сам факт регистрации CPT ещё не означает, что он красиво покажется на фронтенде. Для вывода обычно нужны отдельные шаблоны темы. Если у вас классическая тема, WordPress будет искать файл single-portfolio.php для одиночной записи и archive-portfolio.php для архива. Если таких файлов нет, он использует общие шаблоны темы.

Это удобно на старте, но для нормального проекта лучше сделать отдельные шаблоны, чтобы не смешивать портфолио с обычными постами. В шаблоне архива можно вывести сетку карточек, фильтры и пагинацию. В шаблоне одиночной записи — галерею, описание, характеристики и связанные проекты.

Если тема построена на блоках, логика будет другой: шаблоны собираются через Site Editor, но сам принцип не меняется. CPT регистрируется отдельно, а внешний вид настраивается отдельно.

Частые ошибки при создании custom post type

Самые неприятные проблемы обычно не в самом коде, а в деталях:

  • Тип записей зарегистрирован не на том хуке. Если код выполняется слишком рано, WordPress может не увидеть его корректно. Используйте init.
  • Не обновлены постоянные ссылки. После регистрации почти всегда нужно пересохранить настройки ссылок.
  • Неправильный slug. Не используйте пробелы, кириллицу и слишком длинные имена для внутреннего идентификатора.
  • Тип записей привязан к теме. При смене темы контент останется, но раздел может исчезнуть из интерфейса.
  • Не включён show_in_rest. В современном редакторе это часто приводит к неудобствам, особенно если вы работаете с блоками.

Ещё одна практическая ошибка — делать отдельный CPT там, где достаточно рубрики или страницы. Это усложняет админку и поддержку без реальной пользы. Если сущность не имеет собственной структуры, не дробите сайт без необходимости.

Когда лучше не делать CPT

Собственный тип записей не нужен, если вы просто хотите:

  • добавить несколько дополнительных полей к статье;
  • сделать отдельную подборку материалов без уникальной структуры;
  • разложить обычные записи по рубрикам;
  • создать лендинг или статическую страницу.

В этих случаях CPT будет лишним уровнем сложности. Он оправдан только тогда, когда у контента есть собственная логика, отдельный архив и отдельное место в структуре сайта. Если этого нет, проще и надёжнее использовать стандартные инструменты WordPress.

Если нужен именно рабочий раздел под каталог, кейсы или портфолио, начинайте с простого: зарегистрируйте тип записей, добавьте нужные таксономии, проверьте URL и только потом усложняйте шаблоны и поля. Такой подход обычно быстрее, чем пытаться сразу собрать «идеальную» структуру на старте.

Как удалить лишние скрипты и стили WordPress, чтобы ускорить сайт
16.10.2026
Как отключить Gutenberg и использовать классический редактор в WordPress
20.10.2026
Как создать таксономию в WordPress и привязать её к записям
31.10.2026
Как создать собственный тип записей в WordPress
28.10.2026
Как убрать пагинацию архивов WordPress из индексации
09.10.2026