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

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

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

Custom Post Type — это пользовательский тип записи, который позволяет расширить стандартные возможности WordPress. Например, если вы делаете сайт с каталогом товаров, отзывов, портфолио или мероприятий, создание отдельного типа записи позволит разделить контент логически и визуально.

Основные преимущества использования CPT:

  • Отдельное управление контентом в админке
  • Уникальные шаблоны вывода для разных типов
  • Удобные фильтры и сортировка на фронтенде
  • Гибкость при работе с метаданными и таксономиями

Без CPT многие разработчики создают отдельные категории или используют мета-поля, но это не всегда удобно и масштабируемо.

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

Чтобы зарегистрировать CPT, используется функция register_post_type(). Рекомендуется делать регистрацию в отдельном файле плагина или в functions.php активной темы, используя хук init.

Рассмотрим пример регистрации типа данных «Отзывы».

add_action('init', 'wpboard_register_post_type_reviews');
function wpboard_register_post_type_reviews() {
    $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,
        'has_archive'        => true,
        'show_in_rest'       => true, // поддержка Gutenberg и REST API
        'rewrite'            => array('slug' => 'reviews'),
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'comments'),
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-testimonial',
    );

    register_post_type('wpboard_reviews', $args);
}

В этом примере мы создали тип данных с ярлыком wpboard_reviews, настроили метки для админки, включили поддержку редактора, миниатюр и комментариев. Параметр show_in_rest важен, чтобы CPT был доступен в новом редакторе Gutenberg и API.

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

Чтобы вывести все отзывы на странице, можно создать шаблон archive-wpboard_reviews.php в теме или использовать WP_Query с нужным типом записи.

$args = array(
    'post_type' => 'wpboard_reviews',
    '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 полезно создавать собственные таксономии. Например, для отзывов можно добавить таксономию «Категории отзывов».

Пример регистрации таксономии:

add_action('init', 'wpboard_register_taxonomy_review_category');
function wpboard_register_taxonomy_review_category() {
    $labels = array(
        'name'              => 'Категории отзывов',
        'singular_name'     => 'Категория отзыва',
        'search_items'      => 'Искать категории',
        'all_items'         => 'Все категории',
        'edit_item'         => 'Редактировать категорию',
        'add_new_item'      => 'Добавить новую категорию',
        'menu_name'         => 'Категории отзывов',
    );

    $args = array(
        'hierarchical'      => true,
        'labels'            => $labels,
        'show_ui'           => true,
        'show_in_rest'      => true,
        'rewrite'           => array('slug' => 'review-category'),
    );

    register_taxonomy('wpboard_review_category', 'wpboard_reviews', $args);
}

После этого на странице редактирования отзывов появится отдельный блок для выбора категории.

Плагины для упрощения работы с Custom Post Types

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

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

Для примера, Custom Post Type UI позволяет быстро создать тип данных и экспортировать PHP-код, который можно потом добавить в тему или плагин, что удобно для миграций и контроля версий.

Как добавить метаполя к Custom Post Type

Часто для собственного типа данных нужны дополнительные поля (например, рейтинг отзыва, дата события и т.д.). Для этого можно использовать плагин Clearfy Pro или ACF (Advanced Custom Fields).

Пример добавления метаполя вручную без плагина:

add_action('add_meta_boxes', 'wpboard_add_meta_box_review_rating');
function wpboard_add_meta_box_review_rating() {
    add_meta_box(
        'wpboard_review_rating',
        'Рейтинг отзыва',
        'wpboard_render_review_rating_meta_box',
        'wpboard_reviews',
        'side'
    );
}

function wpboard_render_review_rating_meta_box($post) {
    $value = get_post_meta($post->ID, '_wpboard_review_rating', true);
    echo '<label for="wpboard_review_rating_field">Рейтинг (1-5):</label>';
    echo '<input type="number" id="wpboard_review_rating_field" name="wpboard_review_rating_field" value="' . esc_attr($value) . '" min="1" max="5" />';
}

add_action('save_post', 'wpboard_save_review_rating_meta');
function wpboard_save_review_rating_meta($post_id) {
    if (array_key_exists('wpboard_review_rating_field', $_POST)) {
        update_post_meta(
            $post_id,
            '_wpboard_review_rating',
            intval($_POST['wpboard_review_rating_field'])
        );
    }
}

Это добавит поле рейтинга в боковую панель редактора отзывов.

Вывод метаполей в шаблоне

Для вывода рейтинга в шаблоне используйте:

$rating = get_post_meta(get_the_ID(), '_wpboard_review_rating', true);
echo '<p>Рейтинг: ' . esc_html($rating) . ' / 5</p>';

Поддержка REST API и Gutenberg для собственных типов данных

Для современных сайтов важно, чтобы CPT был доступен через REST API и редактор блоков Gutenberg. Мы в примере выше включили параметр show_in_rest => true. Это позволяет использовать стандартные блоки для редактирования, интегрировать CPT с внешними сервисами и строить SPA-приложения на React или Vue с использованием WP REST API.

Заключение

Создание собственных типов данных — один из ключевых инструментов для разработки на WordPress. Это позволяет структурировать контент, сделать админку удобнее и настроить уникальные шаблоны вывода. В статье рассмотрены основные шаги регистрации CPT, создание таксономий, добавление метаполей и вывод на сайт с примерами кода. Также упомянуты полезные плагины, которые помогут упростить работу.

Как создать пошаговую многошаговую форму в WordPress без плагинов
27.02.2026
Как отключить загрузку Google Fonts в WordPress для ускорения сайта
20.12.2025
Как использовать WPCommunity для создания сообщества на WordPress
23.03.2026
Автоматическое удаление старого контента в WordPress: практическое руководство
30.01.2026
Автоматическое отключение отзывов для отдельных товаров WooCommerce
03.06.2026