Как создать собственный тип записи (custom post type) в WordPress

Работа с собственными типами записей – одна из самых востребованных тем среди разработчиков WordPress. Custom Post Types (CPT) позволяют расширить стандартный функционал сайта, добавив новые виды контента, отличные от обычных записей или страниц. В этой статье разберём, как правильно создать и зарегистрировать собственный тип записи, настроить его отображение и управление, а также приведём полезные примеры кода и советы для оптимальной работы.

Что такое собственный тип записи в WordPress и зачем он нужен

По умолчанию WordPress предлагает два основных типа контента: записи (posts) и страницы (pages). Однако для многих проектов этого недостаточно. Например, если вы хотите вести каталог товаров, портфолио, отзывы или события – лучше создать отдельный тип записи. Это позволит разделить контент по логическим категориям, упростит управление и кастомизацию.

Custom Post Type – это пользовательский тип записи, который можно полностью настроить под нужды сайта. С его помощью можно добавлять уникальные поля, таксономии, шаблоны отображения и многое другое. Благодаря этому ваш сайт становится более структурированным и удобным для администрирования.

Регистрация собственного типа записи: пример кода для wptests_ru_register_custom_post_type

Регистрация CPT происходит с помощью функции register_post_type(), которую нужно вызвать в хук init. Рассмотрим пример создания типа записи «Кейсы» для сайта с тематикой портфолио.

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

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array('slug' => 'cases'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'show_in_rest'       => true,
    );

    register_post_type('wptests_case', $args);
}
add_action('init', 'wptests_ru_register_custom_post_type');

В этом примере мы создаём тип записи с ключом wptests_case. В параметре supports указываем, какие стандартные функции редактора нам нужны – заголовок, текст, миниатюра и пользовательские поля. Параметр show_in_rest позволяет использовать тип записи в Gutenberg и REST API.

Как добавить таксономии для собственного типа записи

Для удобства фильтрации и группировки кастомных записей часто создают собственные таксономии – категории и метки, аналогичные стандартным для записей. Их можно регистрировать функцией register_taxonomy().

Пример добавления таксономии «Тип кейса» к нашему CPT:

function wptests_ru_register_case_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' => 'case-type'),
        'show_in_rest'      => true,
    );

    register_taxonomy('wptests_case_type', array('wptests_case'), $args);
}
add_action('init', 'wptests_ru_register_case_taxonomy');

Теперь в админке появится возможность создавать и назначать типы кейсов, что улучшит структуру контента и пользовательский опыт.

Отображение кастомных записей на фронтенде: шаблоны и WP_Query

Чтобы вывести список или отдельную запись созданного типа на сайте, нужно создать шаблоны в теме или использовать WP_Query.

Для списка кейсов подойдет файл archive-wptests_case.php в папке темы. В нём можно использовать стандартный цикл WordPress:

<?php get_header(); ?>

<h1>Наши кейсы</h1>

<?php if ( have_posts() ) : ?>
    <ul>
    <?php while ( have_posts() ) : the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
    </ul>
<?php else : ?>
    <p>Кейсы не найдены.</p>
<?php endif; ?>

<?php get_footer(); ?>

Для выборки из кода вне шаблонов можно использовать WP_Query с параметром post_type:

$args = array(
    'post_type' => 'wptests_case',
    '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>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo '<p>Кейсы не найдены.</p>';
}

Полезные плагины для работы с собственными типами записей

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

  • Custom Post Type UI – простой интерфейс для регистрации типов записей и таксономий без кода.
  • Pods – расширенный инструмент для создания CPT, таксономий и пользовательских полей с мощным API.
  • Advanced Custom Fields (ACF) – позволяет создавать и выводить кастомные поля для любых типов записей, включая CPT.

Эти плагины значительно ускорят разработку и уменьшат вероятность ошибок, особенно если вы не хотите вникать в детали регистрации типов через код.

Советы по оптимизации и безопасности для собственных типов записей

Создавая CPT, важно помнить о нескольких моментах:

  • Уникальные префиксы: всегда используйте уникальный префикс для идентификаторов функций и ключей CPT, чтобы избежать конфликтов с другими плагинами и темами. В примерах использован префикс wptests_ru_.
  • Поддержка REST API: устанавливайте 'show_in_rest' => true, если планируете использовать Gutenberg или интегрировать данные через API.
  • Капабилити: при необходимости задавайте собственные права доступа для обеспечения безопасности.
  • Оптимизация запросов: при выводе данных учитывайте пагинацию и индексацию для предотвращения нагрузки на сервер.

Также не забывайте проверять работу на локальной копии и использовать отладочные инструменты, чтобы выявить возможные ошибки на ранних этапах.

Как отключить Emoji в WordPress для ускорения сайта
19.04.2026
Как изменить порядок вывода публикаций в WordPress по датам и пользовательским критериям
10.03.2026
WooCommerce: автоматическое изменение стоимости товара при смене вариаций
07.07.2026
Как удалить meta generator из WordPress без плагинов
24.12.2025
WooCommerce: автоматическое изменение стоимости товара при сменах вариаций с подробной диагностикой
10.07.2026