Кастомные типы записей (Custom Post Types, CPT) — один из самых мощных инструментов WordPress, позволяющий расширять функциональность сайта и структурировать контент по своим правилам. Если вы ведете блог, магазин, каталог или любой другой проект, где стандартных записей (постов) и страниц недостаточно, кастомные типы записей помогут организовать данные максимально удобно.
Что такое кастомные типы записей и зачем они нужны в WordPress
По умолчанию WordPress поставляется с несколькими типами записей: посты, страницы, вложения и т.д. Однако нередко возникает необходимость создать уникальный тип контента, например, товары, проекты, отзывы, события и др. Кастомные типы записей позволяют создать отдельную сущность с собственным набором полей, меток и логикой отображения.
Это дает следующие преимущества:
- Упрощение навигации и управления контентом в админке;
- Возможность создавать отдельные шаблоны для разных типов контента;
- Повышение SEO за счет структурированного контента;
- Гибкость при разработке сложных сайтов.
Кастомные типы записей создаются с помощью функции register_post_type(), которую необходимо корректно зарегистрировать в файле functions.php темы или в собственном плагине.
Как зарегистрировать кастомный тип записи на примере «Отзывы»
Ниже пример создания CPT «Отзывы» с метками, поддержкой заголовка, редактора и миниатюры:
function wpchecker_register_reviews_cpt() {
$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' => 'Искать отзывы',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывы не найдены',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'reviews'),
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_rest' => true,
);
register_post_type('wpchecker_review', $args);
}
add_action('init', 'wpchecker_register_reviews_cpt');
В этом коде мы создаем новый тип записи с именем wpchecker_review. Благодаря параметру show_in_rest его можно использовать с Gutenberg и REST API.
Добавление кастомных полей к типу записи с помощью метабоксов
Для хранения дополнительных данных отзывов, например, имени автора и рейтинга, создадим метабоксы.
Пример добавления метабоксов:
function wpchecker_add_reviews_metabox() {
add_meta_box(
'wpchecker_review_details',
'Детали отзыва',
'wpchecker_render_reviews_metabox',
'wpchecker_review',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpchecker_add_reviews_metabox');
function wpchecker_render_reviews_metabox($post) {
wp_nonce_field('wpchecker_save_review_metabox', 'wpchecker_review_nonce');
$author = get_post_meta($post->ID, '_wpchecker_review_author', true);
$rating = get_post_meta($post->ID, '_wpchecker_review_rating', true);
echo '<p><label>Автор отзыва: <input type="text" name="wpchecker_review_author" value="' . esc_attr($author) . '" /></label></p>';
echo '<p><label>Рейтинг (1-5): <input type="number" name="wpchecker_review_rating" min="1" max="5" value="' . esc_attr($rating) . '" /></label></p>';
}
function wpchecker_save_review_metabox($post_id) {
if (!isset($_POST['wpchecker_review_nonce']) || !wp_verify_nonce($_POST['wpchecker_review_nonce'], 'wpchecker_save_review_metabox')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpchecker_review_author'])) {
update_post_meta($post_id, '_wpchecker_review_author', sanitize_text_field($_POST['wpchecker_review_author']));
}
if (isset($_POST['wpchecker_review_rating'])) {
update_post_meta($post_id, '_wpchecker_review_rating', intval($_POST['wpchecker_review_rating']));
}
}
add_action('save_post', 'wpchecker_save_review_metabox');
Теперь при редактировании отзыва появятся поля для ввода имени автора и рейтинга. Эти данные сохраняются в метаданных записи.
Вывод кастомных типов записей и их метаданных на сайте
Для вывода отзывов на фронтенде можно создать шаблон архива archive-wpchecker_review.php или использовать WP_Query в любом месте темы:
$args = array(
'post_type' => 'wpchecker_review',
'posts_per_page' => 10,
);
$reviews = new WP_Query($args);
if ($reviews->have_posts()) {
echo '<ul>';
while ($reviews->have_posts()) {
$reviews->the_post();
$author = get_post_meta(get_the_ID(), '_wpchecker_review_author', true);
$rating = get_post_meta(get_the_ID(), '_wpchecker_review_rating', true);
echo '<li><h3>' . get_the_title() . '</h3>';
echo '<p>' . get_the_content() . '</p>';
echo '<p><strong>Автор:</strong> ' . esc_html($author) . '</p>';
echo '<p><strong>Рейтинг:</strong> ' . intval($rating) . '/5</p></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Отзывы не найдены.</p>';
}
Такой подход дает полный контроль над выводом и позволяет стилизовать контент под дизайн сайта.
Полезные плагины для работы с кастомными типами записей
Если вы предпочитаете не писать код вручную, рекомендуем использовать проверенные плагины:
- Custom Post Type UI — удобный интерфейс для создания и управления CPT и таксономиями без кода.
- Advanced Custom Fields — позволяет создавать сложные поля и метабоксы с GUI.
- Clearfy Pro — плагин для оптимизации и настройки WordPress, частично поддерживает расширение функционала CPT.
Советы по работе с кастомными типами записей
При работе с CPT учитывайте следующие моменты:
- Всегда используйте уникальные префиксы для функций и названий типов, чтобы избежать конфликтов с другими плагинами или темами.
- Не забывайте про поддержку REST API, если планируете использовать Gutenberg или создавать SPA на базе WordPress.
- Оптимизируйте запросы и индексацию, особенно если CPT будут добавлены в поиск или в списки на сайте.
- Для сложных структур используйте кастомные таксономии (категории и метки) вместе с CPT.
- Тестируйте работу CPT на разных версиях PHP и WordPress, чтобы избежать проблем с совместимостью.