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

Типичная история: каталог из нескольких сотен объектов живёт в обычных записях, а цена и площадь вписаны прямо в текст. Заказчик просит фильтр «до 10 млн, центр», и выясняется, что искать нечем. Объекты при этом делят с новостями одну ленту, один RSS и один sitemap. Два очевидных выхода: завести ещё рубрик или поставить плагин и накликать новый тип записи. Оба работают, пока не придёт время платить. Разбираем, во что обходится каждый, для WordPress 6.x.
Три способа завести раздел
Вопросов на самом деле два: нужен ли отдельный тип записи и где хранить признаки объекта, в таксономии или в мета-полях. Начнём с первого.
| Подход | Что выигрываете | Чем платите | Подходит, если |
|---|---|---|---|
| Обычные записи и рубрики | Ноль кода, всё из коробки, один шаблон | Объекты смешаны с новостями в ленте, RSS, поиске и sitemap. У рубрик нет своих полей и прав | Материалы однотипные, разделы отличаются только темой |
| Тип записи в коде плагина | Свои URL, меню, шаблоны, права и REST. Определения лежат в git | Нужен разработчик и деплой. Ошибка в регистрации ломает адреса | Каталог живёт долго, над сайтом работает команда |
| Тип записи через плагин с интерфейсом (CPT UI, новые версии ACF) | Настройка без PHP, быстрый старт | Определения лежат в базе. Отключили плагин, и раздел исчез из админки и с сайта. Сложнее переносить между окружениями | Небольшой сайт или прототип без разработчика |
Отдельная таблица в базе под каталог нужна при очень больших объёмах и сложных запросах. Это отдельная тема, здесь её не разбираем.
Тип записи в коде: минимальный набор
Код кладите в плагин, а не в functions.php темы. Сменили тему, и тип записи пропал: записи остаются в базе, но из админки и с сайта исчезают. Если отдельный плагин делать лень, подойдёт каталог mu-plugins.
<?php
/**
* Plugin Name: Realty Catalog
* Description: Тип записи и таксономия каталога. WordPress 6.x, PHP 7.4+.
*/
add_action( 'init', 'realty_register_model' );
function realty_register_model() {
register_post_type( 'realty_object', array(
'labels' => array(
'name' => 'Объекты',
'singular_name' => 'Объект',
),
'public' => true,
'has_archive' => 'catalog',
'rewrite' => array( 'slug' => 'catalog' ),
'show_in_rest' => true, // без этого откроется классический редактор
'supports' => array( 'title', 'editor', 'thumbnail', 'custom-fields' ),
'menu_icon' => 'dashicons-building',
) );
register_taxonomy( 'realty_district', 'realty_object', array(
'labels' => array(
'name' => 'Районы',
'singular_name' => 'Район',
),
'hierarchical' => true,
'show_in_rest' => true,
'rewrite' => array( 'slug' => 'district' ),
) );
register_post_meta( 'realty_object', 'realty_price', array(
'type' => 'integer',
'single' => true,
'show_in_rest' => true,
'sanitize_callback' => 'absint',
) );
}
// Правила адресов сбрасываем один раз, при активации, а не на каждый запрос.
register_activation_hook( __FILE__, function () {
realty_register_model();
flush_rewrite_rules();
} );Три детали, на которых спотыкаются чаще всего:
- Без
show_in_restтип записи открывается в классическом редакторе, а поля недоступны блокам и REST API. - Чтобы мета-поле попало в REST, тип записи должен поддерживать
custom-fields. - Идентификатор типа записи не длиннее 20 знаков, таксономии не длиннее 32. Ставьте префикс, чтобы не столкнуться с чужим плагином.
Таксономия или мета-поле
Это второй вопрос, и ошибка здесь обходится дороже. Рубрики для района и мета-поле для цены выглядят естественно, но границу между ними проводит не вкус, а то, как значение будет использоваться.
| Признак | Таксономия | Мета-поле |
|---|---|---|
| Значения | Ограниченный повторяющийся набор: район, бренд, тип дома | Уникальные или числовые: цена, площадь, дата |
| Страница «все объекты с этим значением» | Есть из коробки, со своим URL | Нет, делать вручную |
| Сравнение «больше» и «меньше» | Не подходит | Подходит при type NUMERIC или DATE |
| Запрос | tax_query по связям терминов | meta_query, по значению в wp_postmeta индекса нет |
| Интерфейс в админке | Рубрики с чекбоксами или метки | Нужен метабокс или блок |
| Типичная ошибка | Тысячи уникальных терминов раздувают список в админке | Фильтр по значению на большой таблице работает медленно |
Таксономия отвечает на вопрос «к какой группе относится объект», мета-поле на вопрос «какое значение у этого объекта».
Пояснение: термин (term) — одно значение таксономии, например «Центр» в таксономии «Районы». Мета-поле (post meta) — пара «ключ и значение» в таблице wp_postmeta, привязанная к записи.
Как выглядит запрос на практике
Район ищем по термину, цену по числовому мета-полю. Для WordPress 6.x этот запрос работает как есть.
$query = new WP_Query( array(
'post_type' => 'realty_object',
'posts_per_page' => 12,
'tax_query' => array(
array(
'taxonomy' => 'realty_district',
'field' => 'slug',
'terms' => 'center',
),
),
'meta_query' => array(
array(
'key' => 'realty_price',
'value' => 10000000,
'type' => 'NUMERIC',
'compare' => '<=',
),
),
) );Когда что выбирать
- Остаётесь на записях и рубриках, если у материалов одни и те же поля и один шаблон, а разделы отличаются только темой.
- Тип записи в коде, если нужны свои поля, свой адрес вида /catalog/, отдельное меню и права или над сайтом работает больше одного человека.
- Плагин с интерфейсом, если сайт небольшой и разработчика нет. Сразу проверьте, что плагин умеет выгружать определения в виде PHP-кода, иначе переезд обернётся ручной работой.
- Таксономия, если значение повторяется у многих объектов и нужна страница-архив или фильтр «равно».
- Мета-поле, если значение уникально или его сравнивают как число или дату.
Быстрая проверка: нужна ли странице вроде «все объекты с этим значением» отдельная ссылка? Да, значит таксономия. Нет, значит мета-поле.
Что ломается
- Адреса нового типа отдают 404. Правила не сброшены: откройте «Настройки → Постоянные ссылки» и нажмите «Сохранить» либо выполните
wp rewrite flush. - Переименовали идентификатор типа записи или таксономии при готовом контенте. Он хранится в базе строкой, поэтому записи осиротеют. Значения придётся обновлять в базе, и только после бэкапа.
- Слаг архива совпал со слагом обычной страницы или другого типа, и открывается не то. Проверяйте уникальность слагов до запуска.
- Плагин с типом записи удалили. Записи остаются в wp_posts, но на сайте их нет, пока тот же идентификатор не зарегистрируют снова.
- Таксономию завели для уникальных значений вроде телефона или артикула. Список терминов растёт, админка тормозит, а пользы от архивов нет.
Что делать дальше
- Проверьте, что видит WordPress:
wp post-type listиwp taxonomy listпокажут зарегистрированные типы и таксономии. - Поставьте Query Monitor и посмотрите SQL страницы каталога, особенно запросы к wp_postmeta.
- Если фильтр по мета-полю тормозит, решите, что проще: вынести значение в таксономию или заводить отдельную таблицу.
- Подготовьте шаблоны. В классических темах для нового типа это
single-{post_type}.phpиarchive-{post_type}.php. Блочные темы устроены иначе, это отдельная тема. - Сверьте параметры с документацией на developer.wordpress.org для register_post_type и register_taxonomy, ссылки ниже.
Аналитик звонков: Разбор записи звонка по этапам сделки: где сорвалось, что упущено, три исправляемые рекомендации с цитатами.
Спросить за 90 ₽Источники: WordPress Developer Resources: register_post_type(), WordPress Developer Resources: register_taxonomy()
Частые вопросы
Почему после регистрации типа записи страницы отдают 404?
Что будет с записями, если отключить плагин с типом записи?
А если у меня старая версия WordPress?
А если я всё сделал, но тип записи не появился?
Можно ли перенести существующие записи в новый тип?
Не замедлят ли сайт много типов записей и таксономий?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.