Custom Post Types в WordPress: практическое руководство по созданию и использованию

Что такое Custom Post Types и зачем они нужны в WordPress

WordPress изначально создан как платформа для блогов, где основным типом контента является запись (post). Однако, для создания более сложных сайтов, например, с каталогами, портфолио, отзывами или товарами, стандартных записей может быть недостаточно. Здесь на помощь приходят Custom Post Types (CPT) — пользовательские типы записей, позволяющие создавать новые виды контента с уникальной структурой и поведением.

Использование CPT помогает структурировать сайт, облегчить управление контентом и улучшить пользовательский опыт. Например, если вы создаёте сайт ресторана, можно сделать отдельный CPT для меню, чтобы не смешивать блюда с обычными записями блога.

В этой статье мы рассмотрим, как создать CPT вручную через код, а также с помощью популярных плагинов, а также как настроить их отображение и взаимодействие с другими элементами WordPress.

Создание Custom Post Type вручную через functions.php

Самый гибкий способ — зарегистрировать CPT в теме или плагине. Для этого используется функция register_post_type(). Ниже пример кода для создания CPT «Продукты» с базовыми настройками:

function wp1_register_product_post_type() {
    $labels = array(
        'name'               => 'Продукты',
        'singular_name'      => 'Продукт',
        'add_new'            => 'Добавить продукт',
        'add_new_item'       => 'Добавить новый продукт',
        'edit_item'          => 'Редактировать продукт',
        'new_item'           => 'Новый продукт',
        'view_item'          => 'Просмотр продукта',
        'search_items'       => 'Поиск продуктов',
        'not_found'          => 'Продукты не найдены',
        'not_found_in_trash' => 'В корзине продуктов не найдено',
        'menu_name'          => 'Продукты'
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'rewrite'            => array('slug' => 'products'),
        'supports'           => array('title', 'editor', 'thumbnail', 'custom-fields'),
        'show_in_rest'       => true,
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-products',
    );

    register_post_type('wp1_product', $args);
}
add_action('init', 'wp1_register_product_post_type');

В этом коде мы определили метки для интерфейса, сделали CPT публичным и включили поддержку редактора, миниатюр и пользовательских полей. Также указали slug для ЧПУ и добавили иконку в админ-панель.

После добавления этого кода в functions.php темы и обновления панели администратора, в меню появится новый раздел «Продукты».

Особенности и нюансы при регистрации CPT

Обратите внимание на параметр show_in_rest. Он отвечает за поддержку Gutenberg и REST API. Если вы планируете использовать блоковый редактор или API, этот параметр должен быть true.

Параметр supports задаёт, какие возможности будут у записей данного типа — заголовок, редактор, миниатюры, комментарии и др. Подбирайте этот список исходя из потребностей проекта.

Для SEO и удобства пользователей важно правильно настроить параметр rewrite, чтобы ссылки были читаемыми и логичными.

Использование плагинов для создания Custom Post Types

Если вы не хотите писать код или нужно быстро создать CPT, существуют удобные плагины:

  • Custom Post Type UI — позволяет создавать CPT и таксономии через интерфейс без кода.
  • Pods — мощный плагин для создания CPT, таксономий и кастомных полей с гибкими настройками.
  • Toolset Types — комплексное решение для создания сложных типов контента.

Для примера рассмотрим создание CPT с помощью Custom Post Type UI:

  1. Установите и активируйте плагин.
  2. Перейдите в меню «CPT UI» -> «Add/Edit Post Types».
  3. Введите slug, например, wp1_event, название и описание.
  4. Настройте параметры отображения, поддержки и пермалинков.
  5. Сохраните изменения — CPT появится в админке.

Преимущество плагинов — скорость и удобство, недостаток — меньшая гибкость и возможная нагрузка на сайт.

Как вывести Custom Post Types на сайте: запросы WP_Query и шаблоны

Создать CPT — только половина дела, важно правильно вывести их на фронтенде. Для этого используются пользовательские запросы и шаблоны.

Пример простого вывода всех продуктов на странице:

$args = array(
    'post_type' => 'wp1_product',
    'posts_per_page' => 10,
);
$query = new WP_Query($args);

if ($query->have_posts()) :
    echo '<ul>';
    while ($query->have_posts()) : $query->the_post();
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    endwhile;
    echo '</ul>';
    wp_reset_postdata();
else :
    echo 'Продукты не найдены';
endif;

Для более профессионального подхода создайте файл шаблона archive-wp1_product.php в папке темы. WordPress автоматически его использует для архива CPT.

В шаблоне можно использовать стандартные функции цикла WordPress, стилизовать вывод и подключать дополнительные поля.

Добавление пользовательских полей и мета-данных

Часто для CPT нужны дополнительные данные, например цена, дата события или рейтинг. Для этого используются пользовательские поля (Custom Fields) или мета-боксы.

Простейший способ добавить поле — использовать встроенный функционал WordPress. Для более удобной работы подойдут плагины:

  • Advanced Custom Fields (ACF) — позволяет создавать удобные интерфейсы для ввода произвольных данных.
  • Meta Box — аналогичный функционал с расширенными возможностями.

Пример добавления мета-поля «Цена» с помощью ACF:

  1. Установите и активируйте ACF.
  2. Создайте группу полей, выберите тип записи «Продукты».
  3. Добавьте поле с названием «Цена» и типом «Число».
  4. В шаблоне вывода используйте код:
echo 'Цена: ' . get_field('цена') . ' руб.';

Если хотите добавить мета-бокс вручную, можно использовать хук add_meta_boxes и функцию add_meta_box(). Это более сложный путь, требующий знаний PHP и WordPress API.

Регистрация таксономий для Custom Post Types

Для структурирования и фильтрации CPT полезно создавать собственные таксономии — категории и метки.

Пример регистрации таксономии «Категории продуктов» для CPT «Продукты»:

function wp1_register_product_taxonomy() {
    $labels = array(
        'name'              => 'Категории продуктов',
        'singular_name'     => 'Категория продукта',
        'search_items'      => 'Поиск категорий',
        'all_items'         => 'Все категории',
        'edit_item'         => 'Редактировать категорию',
        'update_item'       => 'Обновить категорию',
        'add_new_item'      => 'Добавить новую категорию',
        'new_item_name'     => 'Новое имя категории',
        'menu_name'         => 'Категории продуктов'
    );

    $args = array(
        'hierarchical'      => true,
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'product-category'),
    );

    register_taxonomy('wp1_product_category', array('wp1_product'), $args);
}
add_action('init', 'wp1_register_product_taxonomy');

Таксономии позволяют удобно фильтровать и группировать записи, а также автоматически добавляются в админку.

Советы по оптимизации и безопасности Custom Post Types

При создании CPT важно не забывать про безопасность и производительность:

  • Регистрация CPT и таксономий должна происходить на хуке init для корректной работы.
  • Используйте префиксы в названиях функций и slug, чтобы избежать конфликтов с другими плагинами и темами.
  • Ограничьте права доступа, если нужно, используя параметры capability_type и capabilities.
  • Оптимизируйте запросы, особенно если CPT содержит много записей — используйте кэширование и правильные индексы в базе.
  • Тестируйте отображение CPT на разных устройствах и с разными плагинами, чтобы избежать конфликтов.
Как отключить отзывы WooCommerce для отдельных товаров
28.02.2026
Как создать автоматический импорт продуктов в WordPress с WPSHOP
19.12.2025
Как удалить пустые категории в WordPress через код
12.12.2025
Как отключить кэширование WooCommerce на отдельных страницах WordPress
13.05.2026
Как удалить пустые мета-данные из базы данных WordPress
16.01.2026