В этой статье мы разберем, как создать уникальный кастомный тип записи (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 и таксономий.
Однако собственный код дает понимание и максимальную гибкость.