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

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

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

Собственные типы записей — это возможность создавать новые структуры контента, отличные от стандартных «пост» и «страница». Например, если вы ведёте сайт с обзорами фильмов, удобно создать тип записи «Фильм» с отдельными полями и таксономиями. Это структурирует контент и упрощает управление.

Использование CPT позволяет:

  • Логически разделять разные виды контента на сайте.
  • Применять отдельные метаданные и таксономии.
  • Улучшать SEO за счёт более точной структуры.
  • Упрощать создание шаблонов для вывода уникального контента.

В WP-Team вы можете создавать CPT для любых целей — портфолио, кейсы, мероприятия, товары и многое другое.

Как зарегистрировать собственный тип записи в WordPress

Для создания CPT используем функцию register_post_type(), которую нужно вызывать на хуке init. Важный момент — использовать префиксы в названиях функций и переменных, чтобы не было конфликтов с другими плагинами и темами. В нашем случае добавим префикс wpteam_.

Рассмотрим пример создания CPT «Кейсы» (cases):

function wpteam_register_post_type_cases() {
    $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' => 'cases'),
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'show_in_rest'       => true, // поддержка Gutenberg
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-portfolio',
    );

    register_post_type('cases', $args);
}
add_action('init', 'wpteam_register_post_type_cases');

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

Подробности параметров

Параметр supports отвечает за функционал редактора и мета-полей. Вы можете добавлять или убирать элементы, например, комментарии, автор, страницы аттачментов. Параметр show_in_rest нужен, чтобы CPT поддерживался в новом редакторе Gutenberg и REST API.

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

Для удобной категоризации CPT полезно добавить собственные таксономии. В нашем примере создадим таксономию «Тип кейса» (case_type), которая будет работать как рубрики.

function wpteam_register_taxonomy_case_type() {
    $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('case_type', array('cases'), $args);
}
add_action('init', 'wpteam_register_taxonomy_case_type');

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

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

Чтобы вывести список кейсов на сайте, можно использовать WP_Query с указанием типа записи:

$args = array(
    'post_type' => 'cases',
    '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 'Кейсы не найдены';
}

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

Расширение возможностей: добавление мета-полей для собственного типа записи

Часто нужно хранить дополнительные данные, например, ссылку на проект, дату завершения, заказчика. Для этого используют мета-поля. Их добавляют через add_meta_box() и сохраняют через хук save_post.

Пример добавления мета-бокса с полем «Заказчик» для кейсов:

function wpteam_add_meta_box_case_client() {
    add_meta_box(
        'wpteam_case_client',
        'Заказчик',
        'wpteam_case_client_meta_box_callback',
        'cases',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpteam_add_meta_box_case_client');

function wpteam_case_client_meta_box_callback($post) {
    wp_nonce_field('wpteam_save_case_client_data', 'wpteam_case_client_nonce');

    $value = get_post_meta($post->ID, '_wpteam_case_client', true);

    echo '<label for="wpteam_case_client_field">Имя заказчика:</label>';
    echo '<input type="text" id="wpteam_case_client_field" name="wpteam_case_client_field" value="' . esc_attr($value) . '" size="25" />';
}

function wpteam_save_case_client_data($post_id) {
    if (!isset($_POST['wpteam_case_client_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['wpteam_case_client_nonce'], 'wpteam_save_case_client_data')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (!isset($_POST['wpteam_case_client_field'])) {
        return;
    }

    $client_data = sanitize_text_field($_POST['wpteam_case_client_field']);
    update_post_meta($post_id, '_wpteam_case_client', $client_data);
}
add_action('save_post', 'wpteam_save_case_client_data');

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

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

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

  • Custom Post Type UI — простой интерфейс для создания CPT и таксономий без кода.
  • Advanced Custom Fields Pro — для создания сложных мета-полей и их вывода.
  • Clearfy Pro — оптимизация и расширение возможностей WordPress, в том числе по CPT.

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

Советы и лучшие практики при работе с собственными типами записей

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

  • Используйте уникальные и логичные имена для типа записи и таксономий, чтобы избежать конфликтов.
  • Всегда добавляйте поддержку REST API (show_in_rest), чтобы обеспечить совместимость с Gutenberg и современными инструментами.
  • Создавайте отдельные шаблоны для CPT, чтобы не ломать дизайн сайта и улучшить SEO.
  • Подключайте мета-поля по необходимости, не перегружайте админку лишними полями.
  • Тестируйте работу CPT на локальной копии сайта перед развертыванием.

Следуя этим рекомендациям, вы создадите удобный и масштабируемый инструмент для управления контентом на WordPress.

Как создать выбор по динамическим таксономиям в WordPress
02.03.2026
Как создать автоматические обновления контента в WordPress с помощью Webhooks
15.03.2026
Как создать производительный кэш в WordPress с применением Transients API
19.12.2025
Как добавить поле в регистрацию WordPress с применением хуков
19.01.2026
Как использовать WPRemark для массового комментирования и управления отзывами в WordPress
15.01.2026