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

Что такое кастомные типы записей и зачем они нужны
Кастомный тип записей (custom post type, CPT) — это способ хранить в WordPress не только статьи и страницы, но и любые сущности: товары, события, портфолио, профили сотрудников и прочее. Каждому CPT можно задать собственные поля, таксономии и шаблоны отображения.
Краткое определение: CPT — это сгруппированная логика контента с отдельной админ-меню и URL-архивом.
Важно: CPT не заменяет плагины, но расширяет архитектуру сайта и делает контент более структурированным.
Основные варианты создания CPT
- Плагин — быстро, удобно, подходит для редакторов и непрофессионалов.
- Ручной код — гибко, меньше сторонних зависимостей и потенциального «блоата».
Когда выбирать плагин
- Нужно быстрое решение или GUI для полей и таксономий.
- Вы не хотите редактировать темы/child-тему.
Когда писать код вручную
- Требуется тонкая интеграция с шаблонами и производительностью.
- Вы хотите хранить логику в контролируемом коде (темы/плагин собственной разработки).
Примеры плагинов: Pods (рекомендуется — более 100 000 установок), Custom Post Type UI, Custom Post Type Maker.
Пошаговый SOP: создать CPT вручную (рекомендуется для разработчиков)
- Создайте дочернюю тему или собственный плагин для пользовательского кода. Никогда не правьте родную тему напрямую.
- Откройте файл functions.php дочерней темы или основного плагина.
- Скопируйте и вставьте код регистрации CPT (пример ниже).
- Сохраните файл и обновите админку WordPress.
- Если при переходе на архив CPT возникает 404, зайдите в Настройки → Постоянные ссылки и нажмите «Сохранить изменения» для сброса правил перезаписи.
Ниже — готовый код для CPT «partners» (партнёры):
/*Custom Post type start*/
function cp_post_type_partners() {
$supports = array(
'title', // post title
'editor', // post content
'author', // post author
'thumbnail', // featured images
'excerpt', // post excerpt
'custom-fields', // custom fields
'comments', // post comments
'revisions', // post revisions
'post-formats', // post formats
);
$labels = array(
'name' => _x('partners', 'plural'),
'singular_name' => _x('partner', 'singular'),
'menu_name' => _x('partners', 'admin menu'),
'name_admin_bar' => _x('partners', 'admin bar'),
'add_new' => _x('Add New', 'add new'),
'add_new_item' => __('Add New partner'),
'new_item' => __('New partner'),
'edit_item' => __('Edit partner'),
'view_item' => __('View partner'),
'all_items' => __('All partners'),
'search_items' => __('Search partners'),
'not_found' => __('No partner found.'),
);
$args = array(
'supports' => $supports,
'labels' => $labels,
'public' => true,
'query_var' => true,
'rewrite' => array('slug' => 'partners'),
'has_archive' => true,
'hierarchical' => false,
);
register_post_type('partner', $args);
}
add_action('init', 'cp_post_type_partners');
/*Custom Post type end*/
Этот код регистрирует новый тип записей с архивом по адресу /partners/.
Как проверить и отладить
- После сохранения кода посмотрите в админ-панели — должен появиться пункт меню «Partners».
- Для доступа к архиву откройте yoursite.com/partners/.
- При 404: зайдите в Настройки → Постоянные ссылки и сохраните (сброс правил перезаписи).
- Если CPT не появляется в меню, проверьте ошибки PHP в логах сервера и отключите плагины, конфликтующие с хуками.
Важно: используйте WP_DEBUG и журнал ошибок при разработке.
Сравнение: плагин vs ручной код (краткая матрица)
- Скорость разработки: плагин > код
- Контроль версий: код > плагин
- Производительность: код > плагин
- Удобство для редакторов: плагин > код
Ментальные модели и эвристики при выборе архитектуры
- Если контент — продукт вашей бизнес-логики (например, каталог товара), лучше кодировать CPT и связанные метаполя.
- Если важна скорость запуска и не требуется тонкая кастомизация — используйте Pods или CPT UI.
- Держите логику отображения (templates) отдельно от регистрации типа записей.
Ролевые чеклисты
Для разработчика
- Создать child-тему или плагин
- Зарегистрировать CPT через register_post_type
- Зарегистрировать таксономии и метаполя (если нужно)
- Написать шаблон archive-{post_type}.php и single-{post_type}.php
- Написать миграцию при изменениях slug/labels
Для контент-редактора
- Создать тестовую запись CPT
- Проверить поля и метаданные
- Убедиться, что отображение соответствует требованиям дизайна
Для владельца сайта
- Решить, нужен ли плагин или код
- Установить резервное копирование перед внесением изменений
- Провести нагрузочное тестирование при большом количестве записей
Критерии приёмки
- Новый пункт меню появился в админке
- Можно создать, редактировать и удалить запись CPT
- Архив и одиночная запись отображаются корректно в теме
- Нет 404 после обновления пермалинков
Тест-кейсы и приёмочные сценарии
- Создать запись с изображением и пользовательскими полями — данные сохраняются
- Создать несколько записей и проверить пагинацию архива
- Поменять slug и проверить, что старые URL либо перенаправляются, либо выдаётся 404 с осмысленным сообщением
Отладочный план и откат изменений
- Перед изменением — сделать бэкап файлов и базы данных.
- В случае ошибки — вернуть предыдущий файл functions.php или деактивировать пользовательский плагин.
- Если после изменения slug появились битые ссылки — восстановить старый slug или настроить 301-редиректы.
Примечание: простой способ отката — переименовать функцию регистрации CPT или отключить add_action(‘init’, …).
Альтернативные подходы и расширения
- Advanced Custom Fields (ACF) для удобной работы с метаполями
- WP REST API: открыть CPT для внешних приложений
- Использовать кастомный плагин вместо functions.php для лучшей переносимости и контроля версий
Пример простого потока принятия решения (Mermaid)
flowchart TD
A[Нужен новый тип контента?] -->|Да| B{Требуется UI для полей?}
B -->|Да| C[Используем Pods/ACF]
B -->|Нет| D[Регистрируем CPT в коде]
A -->|Нет| E[Оставляем стандартные типы]Короткий чек-лист по безопасности и производительности
- Не храните чувствительные данные в метаполях без шифрования
- Ограничьте количество кастомных запросов на странице (WP_Query с пагинацией)
- Индексируйте часто используемые метаполя только при необходимости
Финальные советы и лучшие практики
- Всегда работайте в дочерней теме или в собственном плагине.
- Разделяйте регистрацию CPT и логику отображения: register_post_type в одном файле, шаблоны — в теме.
- Используйте локализуемые строки в labels, даже если сайт на одном языке.
- Документируйте изменения и версионируйте код.
Краткое резюме
Кастомные типы записей — это мощный инструмент для структурирования контента в WordPress. Для быстрого запуска используйте Pods или аналоги; если важны производительность и контроль — регистрируйте CPT вручную через functions.php и register_post_type. В статье приведён рабочий пример кода, пошаговый SOP, чеклисты для ролей и тест-кейсы, которые помогут внедрить CPT безопасно и прогнозируемо.
Похожие материалы
Менеджер паролей на Android — настройка и автозаполнение
Телемедицина: как подготовиться и оставаться в безопасности
Научно обоснованные советы по продуктивности
Перенос лицензии Windows 10 на новый ПК
NFT как аватар в Twitter — как настроить