Как создать собственный вид записи в WordPress для специфических типов данных

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

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

Собственный вид записи (CPT) — это дополнительный тип контента, который вы регистрируете в системе. Он позволяет структурировать данные, отделяя их от обычных записей и страниц. Это удобно для сайтов, где нужно хранить, например, товары, проекты, услуги или события.

Использование CPT улучшает организацию сайта и упрощает работу с контентом в админке. Кроме того, собственные типы записей можно выводить отдельно на фронтенде, используя шаблоны, запросы WP_Query и REST API.

Рассмотрим на практике, как создать CPT для «Отзывы» — чтобы клиенты могли оставлять свои отзывы, а вы удобно управляли ими.

Регистрация собственного вида записи через functions.php

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

Пример кода для регистрации CPT «Отзывы» с префиксом wordpresses_ для функций во избежание конфликтов:

function wordpresses_register_reviews_cpt() {
    $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,
        'rewrite'            => array('slug' => 'reviews'),
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-testimonial',
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'comments'),
        'show_in_rest'       => true
    );

    register_post_type('wordpresses_review', $args);
}
add_action('init', 'wordpresses_register_reviews_cpt');

В этом примере:

  • 'supports' включает стандартные возможности записи, такие как заголовок, редактор, миниатюры и комментарии.
  • 'show_in_rest' активирует поддержку REST API, что полезно для блоков Gutenberg и внешних приложений.
  • 'menu_icon' задаёт иконку в админ-панели для удобства.

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

Как использовать собственный вид записи на фронтенде и в шаблонах

Чтобы вывести записи CPT на сайте, можно создать отдельный шаблон архива или одиночной записи. Например, файл archive-wordpresses_review.php для вывода всех отзывов.

Пример простого цикла WordPress для вывода отзывов на странице архива:

if (have_posts()) :
    while (have_posts()) : the_post();
        echo '<h2>' . get_the_title() . '</h2>';
        echo '<div>' . get_the_content() . '</div>';
    endwhile;
else :
    echo 'Отзывы не найдены.';
endif;

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

$args = array(
    'post_type' => 'wordpresses_review',
    'posts_per_page' => 10
);
$reviews_query = new WP_Query($args);

if ($reviews_query->have_posts()) {
    while ($reviews_query->have_posts()) {
        $reviews_query->the_post();
        echo '<h3>' . get_the_title() . '</h3>';
        echo '<p>' . get_the_excerpt() . '</p>';
    }
    wp_reset_postdata();
} else {
    echo 'Отзывы не найдены.';
}

Расширение функционала: таксономии и мета-поля для CPT

Для удобного управления и фильтрации отзывов можно добавить собственные таксономии — категории и теги, например, «Тип отзыва» (положительный, нейтральный, отрицательный).

Регистрация таксономии для CPT:

function wordpresses_register_review_taxonomy() {
    $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-type')
    );

    register_taxonomy('wordpresses_review_type', 'wordpresses_review', $args);
}
add_action('init', 'wordpresses_register_review_taxonomy');

Также можно добавить мета-поля для хранения дополнительной информации, например, оценки или даты отзыва. Для этого удобно использовать плагины, такие как My Popup для создания пользовательских форм или ручное добавление через мета-боксы.

Пример добавления мета-поля «Оценка» для отзывов

Добавим мета-бокс в админке для CPT «Отзывы» с оценкой от 1 до 5:

function wordpresses_add_review_rating_meta_box() {
    add_meta_box(
        'wordpresses_review_rating',
        'Оценка отзыва',
        'wordpresses_render_review_rating_meta_box',
        'wordpresses_review',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wordpresses_add_review_rating_meta_box');

function wordpresses_render_review_rating_meta_box($post) {
    wp_nonce_field('wordpresses_save_review_rating', 'wordpresses_review_rating_nonce');
    $value = get_post_meta($post->ID, '_wordpresses_review_rating', true);
    echo '<label for="wordpresses_review_rating_field">Оценка (1-5):</label> ';
    echo '<input type="number" id="wordpresses_review_rating_field" name="wordpresses_review_rating_field" min="1" max="5" value="' . esc_attr($value) . '" />';
}

function wordpresses_save_review_rating_meta_box_data($post_id) {
    if (!isset($_POST['wordpresses_review_rating_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['wordpresses_review_rating_nonce'], 'wordpresses_save_review_rating')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wordpresses_review_rating_field'])) {
        $rating = intval($_POST['wordpresses_review_rating_field']);
        if ($rating >= 1 && $rating <= 5) {
            update_post_meta($post_id, '_wordpresses_review_rating', $rating);
        } else {
            delete_post_meta($post_id, '_wordpresses_review_rating');
        }
    }
}
add_action('save_post', 'wordpresses_save_review_rating_meta_box_data');

Теперь при редактировании каждого отзыва можно указать оценку, которая будет храниться в мета-данных записи.

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

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

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

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

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

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

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

Например, можно дополнить код сохранения мета-поля дополнительной валидацией и санитизацией.

Как создать динамический список постов с фильтром по таксономии в WordPress
13.01.2026
Как отключить или временно деактивировать плагин в WordPress без удаления
30.12.2025
Как создать глобальный кеш для REST API и ускорить запросы
05.12.2025
Как автоматизировать процесс обновления плагинов WordPress без риска
03.01.2026
Как установить и настроить REST API для собственного плагина
29.11.2025