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

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

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

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

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

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

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

Для регистрации CPT используется функция register_post_type(), которую нужно вызвать в хуке init. Ниже пример создания CPT для отзывов на wpmax.ru.

function wpmax_register_post_type_reviews() {
    $labels = array(
        'name'               => 'Отзывы',
        'singular_name'      => 'Отзыв',
        'menu_name'          => 'Отзывы',
        'name_admin_bar'     => 'Отзыв',
        '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,
        'has_archive'        => true,
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'comments'),
        'show_in_rest'       => true, // для поддержки Gutenberg
        'rewrite'            => array('slug' => 'reviews'),
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-testimonial',
    );

    register_post_type('wpmax_review', $args);
}
add_action('init', 'wpmax_register_post_type_reviews');

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

  • Задаются метки для админки, чтобы интерфейс был понятным для пользователей.
  • Устанавливается публичный доступ и архив.
  • Поддержка стандартных функций записи: заголовок, содержимое, автор, миниатюра, комментарии.
  • Поддержка REST API для совместимости с редактором Gutenberg и внешними запросами.
  • Задаётся иконка в меню админки.

Как добавить уникальные поля и мета-боксы к CPT

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

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

function wpmax_add_meta_box_rating() {
    add_meta_box(
        'wpmax_review_rating',
        'Рейтинг отзыва',
        'wpmax_meta_box_rating_callback',
        'wpmax_review',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpmax_add_meta_box_rating');

function wpmax_meta_box_rating_callback($post) {
    wp_nonce_field('wpmax_save_rating_nonce', 'wpmax_rating_nonce');
    $value = get_post_meta($post->ID, '_wpmax_review_rating', true);
    echo '<label for="wpmax_review_rating_field">Оценка (1–5): </label>';
    echo '<input type="number" id="wpmax_review_rating_field" name="wpmax_review_rating_field" min="1" max="5" value="'.esc_attr($value).'" style="width:100%;">';
}

function wpmax_save_review_rating($post_id) {
    if (!isset($_POST['wpmax_rating_nonce']) || !wp_verify_nonce($_POST['wpmax_rating_nonce'], 'wpmax_save_rating_nonce')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (isset($_POST['wpmax_review_rating_field'])) {
        $rating = intval($_POST['wpmax_review_rating_field']);
        if ($rating < 1) $rating = 1;
        if ($rating > 5) $rating = 5;
        update_post_meta($post_id, '_wpmax_review_rating', $rating);
    }
}
add_action('save_post', 'wpmax_save_review_rating');

Этот код добавляет в боковую панель редактора поле для ввода рейтинга от 1 до 5. При сохранении мета-данные сохраняются в базу, что позволяет потом использовать их на сайте.

Как вывести собственный тип записей на сайте

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

Например, создадим файл archive-wpmax_review.php в папке темы с кодом:

<?php get_header(); ?>
<main>
<h1>Отзывы</h1>
<?php if (have_posts()) : ?>
  <ul>
  <?php while (have_posts()) : the_post(); ?>
    <li>
      <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      <div>Рейтинг: <?php echo esc_html(get_post_meta(get_the_ID(), '_wpmax_review_rating', true)); ?>/5</div>
    </li>
  <?php endwhile; ?>
  </ul>
<?php else : ?>
  <p>Отзывы не найдены.</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>

Так вы получите страницу с перечнем всех отзывов и их рейтингами. Для одиночного отзыва можно создать single-wpmax_review.php с более подробной версткой и выводом дополнительных полей.

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

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

  • Custom Post Type UI — удобный интерфейс для регистрации CPT и таксономий без кода.
  • Advanced Custom Fields (ACF) — мощный плагин для добавления любых кастомных полей к постам, страницам и CPT.
  • Pods — комплексный инструмент для создания и управления CPT, таксономиями и полями.

Однако, если нужна максимальная производительность и контроль, лучше создавать CPT вручную, как показано выше.

Советы по разработке и отладке собственных типов записей

При работе с CPT важно:

  • Всегда использовать уникальные префиксы в названиях функций и мета-ключей, чтобы избежать конфликтов (например, префикс wpmax_).
  • Подключать регистрацию CPT только в хуке init, чтобы WordPress корректно обработал тип.
  • Тестировать вывод и убедиться, что пермалинки обновлены (нужно перейти в Настройки > Постоянные ссылки и сохранить настройки).
  • Добавлять поддержку REST API через параметр show_in_rest для совместимости с Gutenberg и внешними API.
  • При добавлении мета-боксов обязательно проверять nonce и права пользователя при сохранении данных.

Если требуется расширенная функциональность, можно дополнить CPT собственными таксономиями и шаблонами, а также интегрировать с плагинами кеширования и SEO.

Заключение

Создание собственного типа записей в WordPress — это мощный инструмент для организации контента и расширения функционала сайта. С помощью простого кода и правильных подходов вы сможете сделать структуру сайта более удобной и гибкой.

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

Практикуйтесь, создавайте свои типы записей и улучшайте свои WordPress-проекты!

Как добавить уникальные поля в WooCommerce без плагинов
23.12.2025
Как удалить автоматические ревизии в WordPress для оптимизации базы данных
24.02.2026
WooCommerce: как исключить товар из каталога и поиска без удаления
01.06.2026
WooCommerce: как создать кастомный экспорт товаров в CSV без плагинов
15.05.2026
Как создать автоматические задачи в WordPress на основе WP-Cron
19.01.2026