Как я настраиваю кастомные типы записей в WordPress, чтобы не было каши из страниц
Если в WordPress всё складывать в «Записи» и «Страницы», через год проект превращается в свалку: товары рядом с отзывами, кейсы рядом с новостями. В этот момент спасают кастомные post type’ы и таксономии.
Расскажу, как я их использую под реальные проекты, а не ради галочки.
Зачем вообще нужен кастомный тип записи
Я завожу отдельный тип записи, когда:
- сущность по смыслу отличается от обычной записи
- у неё свои поля, своя верстка, свой архив
- по ней удобно строить отдельное меню и фильтры
Примеры: «Кейсы», «Услуги», «Товары», «Вакансии», «Отзывы».
Так в админке у клиента появляется отдельный раздел, а в коде — отдельный шаблон и логика.
Базовый шаблон register_post_type
Я почти всегда регистрирую тип через плагин-обёртку или в functions.php собственной теме:
add_action('init', function () { register_post_type('service', [ 'labels' => [ 'name' => 'Услуги', 'singular_name' => 'Услуга', ], 'public' => true, 'has_archive' => true, 'menu_icon' => 'dashicons-hammer', 'supports' => ['title', 'editor', 'thumbnail'], 'show_in_rest' => true, 'rewrite' => ['slug' => 'services'], ]); });
Что важно:
- has_archive — отдельная страница архива /services
- supports — только нужные редактору блоки
- show_in_rest — включаю, если нужен Gutenberg/REST
Таксономии вместо «категорий для всего»
Чтобы не городить одну общую рубрику, под сущность сразу завожу свою таксономию:
add_action('init', function () { register_taxonomy('service_cat', 'service', [ 'labels' => ['name' => 'Категории услуг'], 'public' => true, 'hierarchical' => true, 'rewrite' => ['slug' => 'service-category'], 'show_in_rest' => true, ]); });
Так:
- услуги живут в своих категориях
- архивы вроде /service-category/seo/ понятно работают
- в шаблонах можно удобно фильтровать по таксономии
Шаблоны под кастомные типы
Основной минимум:
- single-service.php — страница одной услуги
- archive-service.php — список услуг
Это делает проект предсказуемым: открываешь шаблон и сразу видишь, где живёт конкретная сущность.
Если нужен кастомный шаблон под категорию, использую:
- taxonomy-service_cat.php или
- taxonomy-service_cat-{slug}.php
Кастомные поля: где и как я их храню
Для полей (цена, сроки, иконка, преимущества) я:
- либо использую ACF/Carbon Fields
- либо пишу свою мета-форму через add_meta_box
Главное — не тащить всё в произвольный HTML внутри content, а хранить структурированные данные:
$price = get_field('price'); // ACF $timing = get_field('timing'); $badge = get_field('badge');
Так потом проще строить фильтры, списки, карточки и API.
Урлы и пермалинки
Сразу продумываю:
- человекопонятный slug типа services, cases, vacancies
- не пересекаюсь с существующими страницами
После регистрации нового типа всегда делаю:
- Админка → Настройки → Постоянные ссылки → «Сохранить изменения», чтобы обновить правила.
Мини чек-лист по кастомным типам
- Для каждой отдельной сущности заведен свой post type
- У типа есть архив и человекопонятный slug
- Есть отдельные таксономии, не используются общие рубрики «Записей»
- Настроены шаблоны single-.php и archive-.php
- Данные лежат в кастомных полях, а не в «простыне» текста
- Постоянные ссылки обновлены, урлы не конфликтуют со страницами
Итог
Кастомные типы записей и таксономии — это способ превратить WordPress из блога в нормальную CMS. Как только каждую сущность выносишь в свой раздел со своими полями и шаблонами, админка становится понятной для клиента, а код — предсказуемым для разработчика. И уже не страшно через год заходить в проект и что-то дописывать.