Типы записей и таксономии WordPress: чек-лист перед запуском
Тип записи, который отлично работает локально, на проде отдаёт 404, пропадает после смены темы или открывается в классическом редакторе. Собрали проверки, которые ловят это до релиза.

Вы зарегистрировали тип записи «Объекты» и таксономию «Районы», проверили на локальной копии и выкатили на прод. Через час приходят три сообщения: архив отдаёт 404, в админке открылся классический редактор вместо блочного, а после смены темы раздел «Объекты» пропал из меню. Три строки в functions.php работают ровно до первого деплоя. Ниже чек-лист для WordPress 6.x и PHP 8.x: что проверить заранее и чем вы платите за каждое решение.
Где регистрировать код
От этого выбора зависит, переживёт ли тип смену темы и попадёт ли конфигурация в репозиторий.
| Вариант | Что получаете | Чем платите |
|---|---|---|
| functions.php темы | Один файл, быстрый старт | При смене темы типы исчезают из админки и с сайта. Записи остаются в базе, но невидимы |
| Обычный плагин | Не зависит от темы, есть хук активации для сброса правил | Деплоится как плагин, его можно отключить из админки |
| mu-plugin (каталог wp-content/mu-plugins) | Грузится всегда, из админки не отключается | Нет хука активации и обновлений через админку |
| UI-плагин вроде Custom Post Type UI | Настройка без кода | Конфигурация лежит в базе, а не в git. Между окружениями её переносят экспортом |
Для долгоживущего проекта берите обычный плагин. Остальные варианты оправданы в узких случаях, о них ниже.
Тип записи — договор с базой данных: в колонке post_type уже лежат строки, и переименовать их можно только миграцией.
Чек-лист перед выкладкой
- Ключ типа записи: до 20 символов, строчные латинские буквы, цифры, дефис и подчёркивание, с префиксом проекта. Ключ таксономии: до 32 символов.
- Регистрация висит на хуке init.
- У типа и таксономии стоит show_in_rest => true, если нужен блочный редактор.
- Заполнены все labels, а не только name и singular_name.
- Продуманы public, has_archive и видимость в поиске.
- Слаги в rewrite не пересекаются со страницами и друг с другом, задан with_front => false.
- Если доступ нужно ограничить, заданы capability_type и map_meta_cap.
- Правила перезаписи сбрасываются один раз, при активации.
- На копии прода открыты архив, одиночная запись и страница термина.
- Отключение плагина проверено: данные при этом не удаляются.
Разбор пунктов, на которых спотыкаются чаще всего
Имена и префикс
Тип с ключом event или product почти наверняка столкнётся с чужим плагином, поэтому берите префикс проекта: realty_object. У таксономий своя ловушка: публичная таксономия регистрирует query var с тем же именем. Ключи вроде year, name, page, order или type входят в список зарезервированных терминов и ломают выборки. Актуальный список смотрите в документации WordPress по зарезервированным терминам. Переименовать ключ потом можно только миграцией: в wp_posts меняется значение post_type, в wp_term_taxonomy значение taxonomy. Делайте это на копии и с бэкапом.
Регистрация и редактор
Без show_in_rest тип открывается в классическом редакторе, а таксономия не появляется в боковой панели блочного. Неполный набор labels заменяется общими формулировками как у обычных записей: в интерфейсе будет «Добавить запись» вместо «Добавить объект». Полный список подписей и остальных параметров есть в документации register_post_type.
<?php
// Главный файл плагина realty-types.php, WordPress 6.x, PHP 8.x
/**
* Plugin Name: Realty Types
* Version: 1.0.0
*/
add_action( 'init', 'realty_register_types' );
function realty_register_types() {
register_post_type( 'realty_object', array(
'labels' => array(
'name' => 'Объекты',
'singular_name' => 'Объект',
'add_new_item' => 'Добавить объект',
'edit_item' => 'Изменить объект',
),
'public' => true,
'has_archive' => 'objects',
'show_in_rest' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
'rewrite' => array( 'slug' => 'objects', 'with_front' => false ),
) );
register_taxonomy( 'realty_district', array( 'realty_object' ), array(
'labels' => array(
'name' => 'Районы',
'singular_name' => 'Район',
),
'hierarchical' => true,
'show_in_rest' => true,
'show_admin_column' => true,
'rewrite' => array( 'slug' => 'district', 'with_front' => false ),
) );
}
Правила перезаписи
WordPress хранит правила URL в опции базы, и новый тип туда сам не попадает. Пока правила не сброшены, адреса вида /objects/ отдают 404. Сброс дорогой: он пишет в базу, поэтому flush_rewrite_rules() на каждом init превращает каждый запрос в запись. Делайте его один раз, при активации. Хук должен стоять в главном файле плагина:
register_activation_hook( __FILE__, 'realty_activate' );
function realty_activate() {
// Активация идёт после init, поэтому регистрируем типы вручную
realty_register_types();
flush_rewrite_rules();
}
Если код доставляется деплоем и активации нет (mu-plugin), сбрасывайте правила через WP-CLI или кнопкой «Сохранить» в разделе «Настройки → Постоянные ссылки»:
wp rewrite flush
wp rewrite list
Права доступа
По умолчанию тип использует права обычных записей: кто правит записи, тот правит и объекты. Чтобы разделить доступ, задайте собственные права и включите их маппинг:
'capability_type' => array( 'realty_object', 'realty_objects' ),
'map_meta_cap' => true,
Эти две строки идут в массив аргументов register_post_type. Права вида edit_realty_objects нужно один раз выдать ролям через add_cap, иначе доступ потеряют все, включая администратора. Полный список производных прав смотрите в документации register_post_type.
Что ломается
- Архив или запись отдают 404. Правила не сброшены: выполните wp rewrite flush.
- Слаг таксономии совпадает со слагом страницы или архива типа. Срабатывает одно правило, второе даёт 404. Найдите пересечение в выводе wp rewrite list.
- Служебный тип попал в поиск и карту сайта. Публичный тип по умолчанию участвует в поиске, а встроенная карта /wp-sitemap.xml включает публичные типы. Для внутренних данных ставьте public => false и show_ui => true.
- Фильтр по району сделан через мета-поле. У postmeta нет индекса по meta_value, на больших объёмах запрос замедляется. Категориальные данные храните в таксономии.
- Плагин с типом отключили. Записи остаются в wp_posts, но не видны ни в админке, ни на сайте. Вернутся при включении, поэтому не удаляйте их в хуке деактивации.
Когда что выбирать
- Тип нужен одному сайту и живёт годами: обычный плагин в репозитории.
- Тип нельзя отключать ни при каких условиях, например на него завязаны заказы: mu-plugin, а правила сбрасывайте командой wp rewrite flush в деплое.
- Структуру меняет сам владелец сайта: UI-плагин, но экспортируйте настройки и храните файл в git.
- functions.php: только прототип или тема, которую не собираются менять.
Что делать после релиза
Выполните wp rewrite list на проде и убедитесь, что правила для вашего типа на месте. Откройте /wp-sitemap.xml и проверьте, что служебных типов там нет. Включите Query Monitor и посмотрите число запросов на архиве: рост при добавлении фильтров показывает, что пора переносить поля в таксономии. Хранение мета-полей и индексы — отдельная тема, здесь её не разбираем.
Сноска. Правила перезаписи (rewrite rules) — набор шаблонов, по которым WordPress превращает адрес вроде /objects/kvartira-1/ во внутренний запрос с нужным типом записи. Набор хранится в базе и пересобирается при сбросе.
Тендерный специалист 44-ФЗ / 223-ФЗ: Разбор PDF-документации закупки, поиск «заточек» под поставщика, чек-лист заявки.
Спросить за 20 ₽Источники: WordPress Developer Resources: register_post_type(), WordPress Developer Resources: register_taxonomy()
Частые вопросы
Архив типа записи отдаёт 404 после деплоя. Что делать?
У меня другая версия WordPress. Код будет работать?
Нужно ли сбрасывать правила при каждом деплое?
Что будет с записями, если отключить или удалить плагин с типом?
Можно ли переименовать ключ типа записи на живом сайте?
Почему таксономия не видна в боковой панели блочного редактора?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.