В WordPress по умолчанию есть несколько типов записей, таких как записи (posts), страницы (pages) и вложения (attachments). Однако для многих проектов бывает необходимо создать свои собственные типы записей — Custom Post Types (CPT), чтобы структурировать контент более гибко и удобно. В этой статье мы подробно разберем, как создать CPT с нуля, как добавить к нему таксономии и метаполя, а также приведем примеры кода и рекомендации.
Что такое собственный тип записи в WordPress и зачем он нужен
Пользовательский тип записи — это механизм WordPress, позволяющий создавать новые категории контента, отличные от стандартных записей и страниц. Например, если вы делаете сайт с каталогом товаров, событиями, отзывами, портфолио или рецептами, CPT позволяют логично разделить и организовать данные.
Использование CPT облегчает:
- Управление контентом в админке — отдельное меню и интерфейс.
- Разделение логики и шаблонов вывода для разных типов данных.
- Создание удобной структуры URL и навигации.
Без CPT часто приходится использовать метаданные и таксономии к записям, что усложняет поддержку и ухудшает читаемость кода.
Как зарегистрировать собственный тип записи в WordPress: функция wpco_register_custom_post_type
Для регистрации CPT используется функция register_post_type(). Чтобы сделать код удобным и изолированным, создадим функцию с префиксом wpco_, например, wpco_register_custom_post_type().
function wpco_register_custom_post_type() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'view_item' => 'Просмотреть отзыв',
'search_items' => 'Поиск отзывов',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывы не найдены',
'menu_name' => 'Отзывы'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'otzyvy'),
'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
'show_in_rest' => true,
);
register_post_type('wpco_review', $args);
}
add_action('init', 'wpco_register_custom_post_type');В этом примере мы создаем тип записи «Отзывы» с поддержкой заголовка, содержимого, миниатюры и комментариев. Он будет доступен в админке и на фронтенде с архивной страницей по адресу /otzyvy/.
Пояснения к параметрам
labels — массив с названиями и текстами меню, которые будут отображаться в админке.
public — делает тип записи видимым на сайте и в админке.
has_archive — включает архивную страницу.
rewrite — задает ЧПУ для архива.
supports — какие стандартные возможности поддерживает тип записи.
show_in_rest — включение поддержки REST API и редактора Gutenberg.
Добавление таксономий к собственному типу записи
Чтобы удобно структурировать записи, к CPT можно добавить таксономии — категории и метки или свои собственные. В нашем примере с отзывами можно добавить таксономию «Тип отзыва».
function wpco_register_review_taxonomy() {
$labels = array(
'name' => 'Типы отзывов',
'singular_name' => 'Тип отзыва',
'search_items' => 'Искать типы отзывов',
'all_items' => 'Все типы',
'edit_item' => 'Редактировать тип',
'update_item' => 'Обновить тип',
'add_new_item' => 'Добавить новый тип',
'new_item_name' => 'Название нового типа',
'menu_name' => 'Типы отзывов',
);
$args = array(
'hierarchical' => true, // как категории
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'review-type'),
);
register_taxonomy('wpco_review_type', array('wpco_review'), $args);
}
add_action('init', 'wpco_register_review_taxonomy');Теперь у отзывов будет выпадающий список с типами, который можно использовать для фильтрации и группировки.
Добавление пользовательских полей (метаполей) для CPT
Для хранения дополнительной информации, например, рейтинга отзыва, можно использовать метаполя. Есть много плагинов (Advanced Custom Fields, Meta Box), но можно сделать и на чистом PHP.
Добавим поле «Рейтинг» (от 1 до 5) на страницу редактирования записи:
function wpco_add_custom_meta_box() {
add_meta_box(
'wpco_review_rating',
'Рейтинг отзыва',
'wpco_meta_box_callback',
'wpco_review',
'side'
);
}
add_action('add_meta_boxes', 'wpco_add_custom_meta_box');
function wpco_meta_box_callback($post) {
wp_nonce_field('wpco_save_meta_box_data', 'wpco_meta_box_nonce');
$value = get_post_meta($post->ID, '_wpco_review_rating', true);
echo '<label for="wpco_review_rating_field">Рейтинг (1-5): </label>';
echo '<input type="number" id="wpco_review_rating_field" name="wpco_review_rating_field" min="1" max="5" value="' . esc_attr($value) . '" size="25" />';
}
function wpco_save_meta_box_data($post_id) {
if (!isset($_POST['wpco_meta_box_nonce']) || !wp_verify_nonce($_POST['wpco_meta_box_nonce'], 'wpco_save_meta_box_data')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (!isset($_POST['wpco_review_rating_field'])) {
return;
}
$rating = sanitize_text_field($_POST['wpco_review_rating_field']);
if ($rating < 1) $rating = 1;
if ($rating > 5) $rating = 5;
update_post_meta($post_id, '_wpco_review_rating', $rating);
}
add_action('save_post', 'wpco_save_meta_box_data');Этот код добавляет поле рейтинга в сайдбар редактора, сохраняет и валидирует данные.
Вывод пользовательского типа записи на фронтенде с кастомным шаблоном
Чтобы вывести CPT на сайте, можно создать шаблон archive-wpco_review.php в теме, где будет логика вывода списка отзывов.
Пример простого цикла вывода с рейтингом:
<?php if (have_posts()) : ?>
<ul class="wpco-reviews-list">
<?php while (have_posts()) : the_post(); ?>
<li>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="review-rating">Рейтинг: <?php echo esc_html(get_post_meta(get_the_ID(), '_wpco_review_rating', true)); ?>/5</div>
<div class="review-content"><?php the_content(); ?></div>
</li>
<?php endwhile; ?>
</ul>
<?php else : ?>
<p>Отзывы не найдены.</p>
<?php endif; ?>Полезные плагины для работы с пользовательскими типами записей
Если не хочется писать код вручную, можно использовать проверенные плагины:
- Custom Post Type UI — удобный интерфейс для создания CPT и таксономий без кода.
- Advanced Custom Fields — мощный инструмент для добавления и управления метаполями.
- Pods — расширенный фреймворк для создания CPT, таксономий и полей с гибкой настройкой.
Все они интегрируются с REST API и поддерживают редактор Gutenberg.
Советы по работе с собственными типами записей
- Используйте уникальные префиксы в названиях функций и CPT, чтобы избежать конфликтов (например, wpco_).
- Определяйте «supports» с учетом реальных потребностей, чтобы не перегружать интерфейс.
- Создавайте кастомные шаблоны для CPT, чтобы обеспечить уникальный дизайн и функционал.
- Добавляйте таксономии для удобной фильтрации и навигации.
- Следите за производительностью, особенно если CPT используются на больших сайтах.