Как создать уникальный тип записи в WordPress с подключением метабоксов

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

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

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

Например, если вы делаете сайт с каталогом книг, то лучше создать CPT «books», чтобы отдельно хранить и структурировать информацию о книгах, не смешивая с обычными записями блога.

Регистрация кастомного типа записи с префиксом wpsource_

Для создания CPT в WordPress используется функция register_post_type(). Мы создадим функцию wpsource_register_custom_post_type() и подключим её к хуку init. Это базовый и надежный способ.

function wpsource_register_custom_post_type() {
  $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'       => 'Искать отзывы',
    'parent_item_colon'  => 'Родительский отзыв:',
    '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' => 'otzyvy'),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => 20,
    'supports'           => array('title', 'editor', 'author', 'thumbnail')
  );

  register_post_type('wpsource_otzyvy', $args);
}
add_action('init', 'wpsource_register_custom_post_type');

В этом примере создается тип записи «Отзывы» с поддержкой заголовка, редактора, автора и миниатюры. Слаг будет otzyvy, а внутренний идентификатор — wpsource_otzyvy (префикс для избежания конфликтов).

Добавление метабоксов для кастомного типа записи

Чтобы добавить дополнительные поля и удобный интерфейс для ввода информации, используем метабоксы. Ниже пример добавления метабокса для оценки отзыва (от 1 до 5 звезд).

Регистрация метабокса

function wpsource_add_metaboxes() {
  add_meta_box(
    'wpsource_rating_metabox',
    'Оценка отзыва',
    'wpsource_rating_metabox_callback',
    'wpsource_otzyvy',
    'side',
    'default'
  );
}
add_action('add_meta_boxes', 'wpsource_add_metaboxes');

function wpsource_rating_metabox_callback($post) {
  wp_nonce_field('wpsource_save_rating_data', 'wpsource_rating_meta_box_nonce');

  $value = get_post_meta($post->ID, '_wpsource_rating_value', true);
  echo '<label for="wpsource_rating_field">Введите оценку (1-5): </label>';
  echo '<input type="number" id="wpsource_rating_field" name="wpsource_rating_field" min="1" max="5" value="' . esc_attr($value) . '" size="25" />';
}

Этот метабокс появится в боковой панели редактирования отзыва и позволит ввести оценку от 1 до 5.

Сохранение данных метабокса

Для сохранения введенного значения используем хук save_post и проверяем nonce для безопасности:

function wpsource_save_rating_data($post_id) {
  if (!isset($_POST['wpsource_rating_meta_box_nonce'])) {
    return;
  }
  if (!wp_verify_nonce($_POST['wpsource_rating_meta_box_nonce'], 'wpsource_save_rating_data')) {
    return;
  }
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return;
  }
  if (!current_user_can('edit_post', $post_id)) {
    return;
  }

  if (!isset($_POST['wpsource_rating_field'])) {
    return;
  }

  $rating_data = intval($_POST['wpsource_rating_field']);
  if ($rating_data < 1) $rating_data = 1;
  if ($rating_data > 5) $rating_data = 5;

  update_post_meta($post_id, '_wpsource_rating_value', $rating_data);
}
add_action('save_post', 'wpsource_save_rating_data');

Таким образом, данные корректно сохраняются и доступны для вывода на сайте.

Вывод данных кастомного типа записи и метабоксов на фронтенде

Чтобы показать отзывы с оценками на сайте, можно создать шаблон архива или использовать WP_Query в нужном месте темы.

$args = array(
  'post_type' => 'wpsource_otzyvy',
  'posts_per_page' => 10
);
$query = new WP_Query($args);

if ($query->have_posts()) {
  while ($query->have_posts()) {
    $query->the_post();
    $rating = get_post_meta(get_the_ID(), '_wpsource_rating_value', true);
    echo '<h2>' . get_the_title() . '</h2>';
    echo '<div>' . get_the_content() . '</div>';
    echo '<div>Оценка: ' . esc_html($rating) . ' / 5</div>';
  }
  wp_reset_postdata();
} else {
  echo 'Отзывы не найдены.';
}

Это базовый пример, который можно дополнить пагинацией, фильтрами и стилизацией.

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

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

  • Использовать префиксы для функций, мета-ключей и идентификаторов, чтобы избежать конфликтов.
  • Проводить проверку прав пользователя перед сохранением данных.
  • Использовать nonce для защиты от CSRF-атак.
  • Не хранить избыточные или ненужные данные в метаполях.
  • Оптимизировать запросы, ограничивая число записей и используя кэширование.

Альтернативы: плагины для создания CPT и метабоксов

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

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

Однако собственный код дает понимание и максимальную гибкость.

WooCommerce: как отправлять уведомления о заказах по email без плагинов
29.04.2026
Как добавить собственные поля в WordPress без плагинов
10.11.2025
Как запретить отображение отзывов по категории в WordPress
16.03.2026
WooCommerce: как автоматически очищать корзину и сессии после оформления заказа
14.05.2026
Как отложить загрузку скриптов в WordPress без плагинов
07.01.2026