В этой статье разберём подробно, как создавать и эффективно использовать собственные типы записей (Custom Post Types, CPT) в WordPress. Это один из ключевых инструментов для расширения функционала сайта и структурирования контента. Вы узнаете, как зарегистрировать новый тип записи, добавить метабоксы, управлять отображением на фронтенде и использовать CPT в запросах и шаблонах.
Что такое собственные типы записей и зачем они нужны
WordPress по умолчанию поддерживает несколько типов содержимого: записи (posts), страницы (pages), вложения (attachments) и т.д. Однако при разработке сложных сайтов часто необходимо создавать специализированные типы контента. Например, для портфолио, отзывов, товаров, мероприятий и прочего.
Собственные типы записей позволяют:
- Организовать контент по категориям, отличным от стандартных блоговых записей;
- Добавить уникальные поля и метаданные;
- Упростить работу для пользователей и редакторов;
- Создавать отдельные архивы и шаблоны отображения.
Без CPT вы быстро столкнётесь с ограничениями и не сможете гибко управлять структурой сайта.
Регистрация собственного типа записи через функцию wpblog_register_custom_post_type()
Для регистрации CPT используем функцию register_post_type(). Важно делать это на хуке init. Рассмотрим пример создания типа записи «Кейсы».
function wpblog_register_custom_post_type() {
$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,
'rewrite' => array('slug' => 'cases'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
);
register_post_type('case', $args);
}
add_action('init', 'wpblog_register_custom_post_type');В этом примере создаётся тип записи case с поддержкой заголовка, содержимого, миниатюры и произвольных полей. Параметр show_in_rest важен для совместимости с редактором Gutenberg и REST API.
Пояснения к параметрам
labels — задают подписи в админке.
public — определяет доступность типа для фронтенда и админки.
has_archive — разрешает создание архивной страницы с URL /cases/.
rewrite — задаёт правила ЧПУ.
supports — определяет поддерживаемые возможности.
menu_icon — иконка в меню админки.
Добавление метабоксов с помощью wpblog_add_custom_meta_boxes()
Часто требуется добавить уникальные поля для CPT. Для этого используем метабоксы. Пример добавления метабокса «Информация о кейсе» с полем «Клиент».
function wpblog_add_custom_meta_boxes() {
add_meta_box(
'wpblog_case_info',
'Информация о кейсе',
'wpblog_case_info_callback',
'case',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wpblog_add_custom_meta_boxes');
function wpblog_case_info_callback($post) {
wp_nonce_field('wpblog_save_case_info', 'wpblog_case_info_nonce');
$client = get_post_meta($post->ID, '_wpblog_case_client', true);
echo '<label for="wpblog_case_client">Клиент:</label> ';
echo '<input type="text" id="wpblog_case_client" name="wpblog_case_client" value="' . esc_attr($client) . '" size="25" />';
}
function wpblog_save_case_info($post_id) {
if (!isset($_POST['wpblog_case_info_nonce']) || !wp_verify_nonce($_POST['wpblog_case_info_nonce'], 'wpblog_save_case_info')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpblog_case_client'])) {
update_post_meta($post_id, '_wpblog_case_client', sanitize_text_field($_POST['wpblog_case_client']));
}
}
add_action('save_post', 'wpblog_save_case_info');Этот код добавляет метабокс с полем ввода, сохраняет данные безопасно с помощью nonce и проверок прав.
Вывод собственных типов записей на фронтенде: шаблоны и WP_Query
Чтобы отобразить записи CPT, создают отдельные шаблоны:
archive-case.php— для архива кейсов;single-case.php— для отдельной записи кейса.
Пример запроса для вывода 5 последних кейсов с сортировкой по дате:
$args = array(
'post_type' => 'case',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC',
);
$wpblog_query = new WP_Query($args);
if ($wpblog_query->have_posts()) {
while ($wpblog_query->have_posts()) {
$wpblog_query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo '<div>' . get_the_excerpt() . '</div>';
}
wp_reset_postdata();
} else {
echo '<p>Кейсы не найдены.</p>';
}Важно всегда сбрасывать постдату после пользовательских запросов.
Использование плагинов для расширения возможностей CPT
Если хочется добавить функционал без программирования, можно использовать плагины:
- Custom Post Type UI — для удобного создания и управления CPT и таксономиями.
- Advanced Custom Fields — для добавления сложных полей и метаданных к CPT.
- Clearfy Pro — для комплексной оптимизации и управления функционалом WordPress, включая настройку CPT.
Комбинация программного кода и плагинов позволяет создавать мощные и удобные решения для любых задач.
Советы по SEO и производительности для собственных типов записей
При создании CPT важно учитывать влияние на SEO и скорость сайта:
- Используйте ЧПУ с ключевыми словами через параметр
rewrite. - Создавайте отдельные sitemap для CPT, если используете SEO-плагины — например, Clearfy Pro помогает с настройками.
- Оптимизируйте запросы, избегайте избыточных метаполей и тяжелых join-запросов.
- Добавляйте кэширование для страниц CPT, особенно если их много.
Следуя этим рекомендациям, вы получите быстро работающий и SEO-дружественный сайт с собственными типами записей.