Как создать собственный тип записей (Custom Post Type) в WordPress

Что такое собственный тип записей (Custom Post Type) в WordPress

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

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

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

Регистрация собственного типа записей вручную: пример кода

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

function wpticket_register_events_cpt() {
    $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' => 'events'),
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'comments'),
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-calendar',
        'show_in_rest'       => true
    );

    register_post_type('wpticket_event', $args);
}
add_action('init', 'wpticket_register_events_cpt');

В этом коде мы создали CPT с уникальным идентификатором wpticket_event, добавили пользовательские метки для удобства в админке, указали поддержку заголовка, редактора, миниатюры и комментариев, а также сделали его доступным в REST API для работы с Gutenberg и внешними приложениями.

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

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

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

Ручное добавление мета-бокса

Пример создания мета-бокса для даты события:

function wpticket_add_event_meta_box() {
    add_meta_box(
        'wpticket_event_date',
        'Дата события',
        'wpticket_event_date_callback',
        'wpticket_event',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpticket_add_event_meta_box');

function wpticket_event_date_callback($post) {
    wp_nonce_field('wpticket_save_event_date', 'wpticket_event_date_nonce');
    $value = get_post_meta($post->ID, '_wpticket_event_date', true);
    echo '<input type="date" id="wpticket_event_date" name="wpticket_event_date" value="' . esc_attr($value) . '" />';
}

function wpticket_save_event_date_meta($post_id) {
    if (!isset($_POST['wpticket_event_date_nonce']) || !wp_verify_nonce($_POST['wpticket_event_date_nonce'], 'wpticket_save_event_date')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wpticket_event_date'])) {
        update_post_meta($post_id, '_wpticket_event_date', sanitize_text_field($_POST['wpticket_event_date']));
    }
}
add_action('save_post', 'wpticket_save_event_date_meta');

Этот код добавляет в боковую панель редактора поля для ввода даты, сохраняет её при сохранении записи и выводит в защищённом виде. Аналогично можно добавить и другие поля.

Использование плагинов для создания и управления CPT

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

  • Custom Post Type UI — удобный интерфейс для регистрации CPT и таксономий без кода.
  • Advanced Custom Fields (ACF) — мощный инструмент для создания любых мета-полей с гибкой логикой отображения.

Сначала создайте CPT через Custom Post Type UI, затем с помощью ACF добавьте необходимые поля, которые будут автоматически отображаться в редакторе. Такой подход подходит для пользователей без опыта программирования и для быстрого прототипирования.

Вывод данных собственного типа записей на сайте

Чтобы вывести список или отдельные записи CPT на сайте, можно использовать WP_Query с фильтрацией по типу записей.

$args = array(
    'post_type' => 'wpticket_event',
    'posts_per_page' => 10,
    'meta_key' => '_wpticket_event_date',
    'orderby' => 'meta_value',
    'order' => 'ASC'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    echo '<ul>';
    while ($query->have_posts()) {
        $query->the_post();
        $date = get_post_meta(get_the_ID(), '_wpticket_event_date', true);
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> — ' . esc_html($date) . '</li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo '<p>Событий не найдено.</p>';
}

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

Полезные рекомендации и советы

При создании CPT учитывайте следующее:

  • Всегда используйте уникальный префикс в идентификаторах и названиях функций, чтобы избежать конфликтов — например, wpticket_.
  • Добавляйте поддержку REST API (show_in_rest => true) для совместимости с блоковым редактором и внешними сервисами.
  • Оптимизируйте запросы WP_Query, чтобы не перегружать сайт.
  • Используйте таксономии для удобной категоризации и фильтрации CPT.

Создание собственных типов записей — это мощный инструмент для расширения функционала WordPress и адаптации под задачи любого проекта. Главное — делать это грамотно и структурированно.

Как создать систему привязки тикетов к пользователям в WordPress
31.01.2026
Как сделать автоматический импорт отзывов в WordPress
10.04.2026
Отладка и решение проблем с AJAX-запросами в WordPress: практическое руководство
26.04.2026
Как создать двухуровневую систему разрешений в WordPress для тикетов
24.03.2026
Как создать автоматический отчет о проблемах в тикет-системе WordPress
26.02.2026