В 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-проекты!