Как я настраиваю кастомные типы записей в 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. Как только каждую сущность выносишь в свой раздел со своими полями и шаблонами, админка становится понятной для клиента, а код — предсказуемым для разработчика. И уже не страшно через год заходить в проект и что-то дописывать.

#wordpress #php #development

Как я настраиваю кастомные типы записей в WordPress, чтобы не было каши из страниц
Если в WordPress всё складывать в «Записи» и «Страницы», через год проект превращается в свалку: товары рядом с отзыв... | Сетка — социальная сеть от hh.ru