Как использовать Custom Post Types для создания нестандартных типов записей

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

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

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

Custom Post Types позволяют:

  • Логически отделить разные типы контента.
  • Добавить уникальные настройки и мета-поля для каждого типа.
  • Облегчить администрирование и навигацию по сайту.
  • Улучшить SEO за счёт структурированного контента.

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

Как создать Custom Post Type в WordPress: пример кода

Создать CPT можно с помощью функции register_post_type(). Лучшее место для этого — файл functions.php вашей темы или специальный плагин. Ниже пример создания CPT для «Книги» (books) на сайте WordPressa.

function wordpressa_register_post_type_books() {
    $labels = array(
        'name'                  => 'Книги',
        'singular_name'         => 'Книга',
        'menu_name'             => 'Книги',
        'name_admin_bar'        => 'Книга',
        'add_new'               => 'Добавить новую',
        'add_new_item'          => 'Добавить новую книгу',
        'new_item'              => 'Новая книга',
        'edit_item'             => 'Редактировать книгу',
        'view_item'             => 'Просмотреть книгу',
        'all_items'             => 'Все книги',
        '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' => 'book'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
        'show_in_rest'       => true,
    );

    register_post_type('book', $args);
}
add_action('init', 'wordpressa_register_post_type_books');

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

Добавление кастомных таксономий для Custom Post Types

Для улучшения структуры полезно добавить таксономии, например, категории и теги, но отдельные для CPT. Создадим таксономию «Жанры» для типа «Книги».

function wordpressa_register_taxonomy_genres() {
    $labels = array(
        'name'              => 'Жанры',
        'singular_name'     => 'Жанр',
        'search_items'      => 'Искать жанры',
        'all_items'         => 'Все жанры',
        'parent_item'       => 'Родительский жанр',
        'parent_item_colon' => 'Родительский жанр:',
        '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' => 'genre'),
        'show_in_rest'      => true,
    );

    register_taxonomy('genre', array('book'), $args);
}
add_action('init', 'wordpressa_register_taxonomy_genres');

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

Как выводить Custom Post Types на фронтенде

Для отображения CPT на сайте можно использовать WP_Query с указанием типа записи. Пример вывода списка книг:

$args = array(
    'post_type' => 'book',
    'posts_per_page' => 10,
);
$wordpressa_books_query = new WP_Query($args);
if ($wordpressa_books_query->have_posts()) {
    echo '<ul>';
    while ($wordpressa_books_query->have_posts()) {
        $wordpressa_books_query->the_post();
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    }
    echo '</ul>';
} else {
    echo 'Книги не найдены.';
}
wp_reset_postdata();

Этот код выводит заголовки книг в виде списка с ссылками на отдельные записи. Аналогично можно выводить отдельные поля и таксономии.

Использование мета-полей с Custom Post Types

Часто требуется добавить уникальные данные к CPT, например, автор книги, год издания и т.д. Для этого используют пользовательские мета-поля. Их можно добавить вручную через функцию add_meta_box() или с помощью плагинов, например, Advanced Custom Fields (ACF).

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

function wordpressa_add_meta_box_year() {
    add_meta_box(
        'wordpressa_year_meta_box',
        'Год издания',
        'wordpressa_year_meta_box_callback',
        'book',
        'side'
    );
}
add_action('add_meta_boxes', 'wordpressa_add_meta_box_year');

function wordpressa_year_meta_box_callback($post) {
    $value = get_post_meta($post->ID, '_wordpressa_year', true);
    echo '<label for="wordpressa_year_field">Год:</label>';
    echo '<input type="number" id="wordpressa_year_field" name="wordpressa_year_field" value="' . esc_attr($value) . '" size="4" />';
}

function wordpressa_save_year_meta_box_data($post_id) {
    if (!isset($_POST['wordpressa_year_field'])) {
        return;
    }
    $year_data = sanitize_text_field($_POST['wordpressa_year_field']);
    update_post_meta($post_id, '_wordpressa_year', $year_data);
}
add_action('save_post', 'wordpressa_save_year_meta_box_data');

После добавления этого кода в админке у записей типа «Книга» появится поле для ввода года издания.

Советы по работе с Custom Post Types

  • Всегда используйте уникальные префиксы для функций, чтобы избежать конфликтов (например, wordpressa_).
  • Не забудьте добавить поддержку REST API ('show_in_rest' => true) для совместимости с Gutenberg и внешними приложениями.
  • Для сложных мета-полей используйте проверенные плагины, например, ACF, чтобы не писать всё вручную.
  • При необходимости создавайте отдельные шаблоны для CPT — single-book.php для отдельной записи и archive-book.php для архива.
  • Регулярно проверяйте работоспособность CPT после обновлений WordPress и плагинов.

Заключение

Custom Post Types — ключевой инструмент для расширения возможностей WordPress. Они позволяют создавать сайты с уникальной структурой и удобным управлением контентом. В этой статье на wordpressa.ru мы рассмотрели создание CPT, добавление таксономий и мета-полей, а также вывод данных на сайте. Используйте эти знания, чтобы сделать свои проекты более профессиональными и удобными для пользователей.

Как настроить разделённый кеш в WordPress для ускорения сайта
08.03.2026
Как правильно настроить автообновление плагинов без ошибок
05.12.2025
Как использовать AJAX в WordPress для обновления контента без перезагрузки страницы
01.04.2026
Как автоматически удалять неактивных пользователей в WordPress
25.03.2026
Как сделать автоматический откат обновлений WordPress при ошибках
30.01.2026