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

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

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

Custom Post Type — это пользовательский тип записей, который позволяет расширить стандартные возможности WordPress. Использование CPT даёт следующие преимущества:

  • Группировка похожих данных в отдельный тип записи
  • Удобство управления и отображения контента через админ-панель
  • Возможность применять отдельные шаблоны и таксономии
  • Улучшение структуры сайта и SEO

Например, если вы ведёте сайт с рецептами, создание CPT «Рецепты» позволит отделить их от обычных новостей или статей.

Основные параметры при регистрации собственного типа записей

Для регистрации CPT в WordPress используется функция register_post_type(). Она принимает два параметра — идентификатор типа и массив настроек. Ключевые параметры:

  • labels — массив с названиями для интерфейса
  • public — отображать ли в публичной части сайта
  • show_in_menu — показывать ли в админ-панели меню
  • supports — какие стандартные возможности подключить (заголовок, редактор, миниатюра и др.)
  • has_archive — поддержка архива типа записей
  • rewrite — настройка ЧПУ (человекопонятных URL)

Разберём на конкретном примере.

Пример кода: создание типа записей «Отзывы»

Добавьте следующий код в файл functions.php вашей темы или создайте небольшой плагин. Код создаст новый тип записей с именем wpclass_review для отзывов клиентов.

function wpclass_register_review_cpt() {
    $labels = array(
        'name' => 'Отзывы',
        'singular_name' => 'Отзыв',
        'menu_name' => 'Отзывы',
        'add_new' => 'Добавить отзыв',
        'add_new_item' => 'Добавить новый отзыв',
        'edit_item' => 'Редактировать отзыв',
        'new_item' => 'Новый отзыв',
        'view_item' => 'Просмотреть отзыв',
        'search_items' => 'Искать отзывы',
        'not_found' => 'Отзывы не найдены',
        'not_found_in_trash' => 'В корзине отзывы не найдены',
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'show_in_menu' => true,
        'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
        'has_archive' => true,
        'rewrite' => array('slug' => 'otzyvy'),
        'menu_icon' => 'dashicons-testimonial',
        'show_in_rest' => true, // Для поддержки Gutenberg
    );

    register_post_type('wpclass_review', $args);
}
add_action('init', 'wpclass_register_review_cpt');

Объяснение кода:

  • В $labels задаются пользовательские названия для интерфейса админки.
  • В $args определяются параметры: публичный тип, поддержка редактора, миниатюр, настраиваемых полей.
  • 'rewrite' => array('slug' => 'otzyvy') позволяет получить URL вида site.ru/otzyvy/название-отзыва.
  • show_in_rest включает поддержку редактора Gutenberg и REST API.

Как добавить мета-блоки для дополнительных полей отзывов

Чтобы хранить дополнительные данные, например, рейтинг, имя клиента и дату, лучше использовать мета-боксы. Пример добавления мета-бокса с полем "Рейтинг":

function wpclass_add_review_meta_box() {
    add_meta_box(
        'wpclass_review_rating',
        'Рейтинг отзыва',
        'wpclass_review_rating_callback',
        'wpclass_review',
        'side'
    );
}
add_action('add_meta_boxes', 'wpclass_add_review_meta_box');

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

function wpclass_save_review_meta_box_data($post_id) {
    if (array_key_exists('wpclass_review_rating_field', $_POST)) {
        update_post_meta(
            $post_id,
            '_wpclass_review_rating',
            intval($_POST['wpclass_review_rating_field'])
        );
    }
}
add_action('save_post', 'wpclass_save_review_meta_box_data');

Этот код добавляет поле «Рейтинг» в редактор отзывов и сохраняет введённое значение при сохранении записи.

Подключение шаблонов для отображения Custom Post Type

Чтобы выводить отзывы красиво на сайте, можно создать отдельные шаблоны:

  • single-wpclass_review.php — для отдельного отзыва
  • archive-wpclass_review.php — для страницы архива отзывов

В этих файлах можно использовать стандартные функции WordPress для вывода заголовка, содержимого и мета-данных, например:

<?php
get_header();
if (have_posts()) : while (have_posts()) : the_post(); ?>
    <h1><?php the_title(); ?></h1>
    <div><?php the_content(); ?></div>
    <p>Рейтинг: <?php echo esc_html(get_post_meta(get_the_ID(), '_wpclass_review_rating', true)); ?></p>
<?php endwhile; endif; get_footer(); ?>
<

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

Если вы не хотите программировать самостоятельно, можно воспользоваться плагинами:

  • Custom Post Type UI — удобный интерфейс для создания и настройки CPT и таксономий.
  • Advanced Custom Fields — мощный инструмент для добавления и управления дополнительными полями.

Оба плагина поддерживают интеграцию с Gutenberg и REST API.

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

При создании CPT важно не забывать:

  • Правильно называть тип записи, используя префикс (например, wpclass_), чтобы избежать конфликтов с другими плагинами.
  • Добавлять поддержку REST API через show_in_rest => true, чтобы использовать редактор Gutenberg и внешние приложения.
  • Регулярно проверять права доступа, чтобы не допустить несанкционированного редактирования.
  • Создавать отдельные шаблоны для CPT, чтобы улучшить UX и SEO.
Как использовать WPCommunity для создания форума на WordPress
10.04.2026
Как удалить неиспользуемые атрибуты и метаданные из WooCommerce
25.04.2026
Как сделать автоматическое удаление старого контента по типу записи в WordPress
03.04.2026
Как отключить и избежать загрузку неиспользуемых шаблонов WordPress
02.02.2026
Как запретить регистрацию пользователей в WooCommerce
28.02.2026