Работа с собственными типами записей – одна из самых востребованных тем среди разработчиков WordPress. Custom Post Types (CPT) позволяют расширить стандартный функционал сайта, добавив новые виды контента, отличные от обычных записей или страниц. В этой статье разберём, как правильно создать и зарегистрировать собственный тип записи, настроить его отображение и управление, а также приведём полезные примеры кода и советы для оптимальной работы.
Что такое собственный тип записи в WordPress и зачем он нужен
По умолчанию WordPress предлагает два основных типа контента: записи (posts) и страницы (pages). Однако для многих проектов этого недостаточно. Например, если вы хотите вести каталог товаров, портфолио, отзывы или события – лучше создать отдельный тип записи. Это позволит разделить контент по логическим категориям, упростит управление и кастомизацию.
Custom Post Type – это пользовательский тип записи, который можно полностью настроить под нужды сайта. С его помощью можно добавлять уникальные поля, таксономии, шаблоны отображения и многое другое. Благодаря этому ваш сайт становится более структурированным и удобным для администрирования.
Регистрация собственного типа записи: пример кода для wptests_ru_register_custom_post_type
Регистрация CPT происходит с помощью функции register_post_type(), которую нужно вызвать в хук init. Рассмотрим пример создания типа записи «Кейсы» для сайта с тематикой портфолио.
function wptests_ru_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,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'cases'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'show_in_rest' => true,
);
register_post_type('wptests_case', $args);
}
add_action('init', 'wptests_ru_register_custom_post_type');В этом примере мы создаём тип записи с ключом wptests_case. В параметре supports указываем, какие стандартные функции редактора нам нужны – заголовок, текст, миниатюра и пользовательские поля. Параметр show_in_rest позволяет использовать тип записи в Gutenberg и REST API.
Как добавить таксономии для собственного типа записи
Для удобства фильтрации и группировки кастомных записей часто создают собственные таксономии – категории и метки, аналогичные стандартным для записей. Их можно регистрировать функцией register_taxonomy().
Пример добавления таксономии «Тип кейса» к нашему CPT:
function wptests_ru_register_case_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' => 'case-type'),
'show_in_rest' => true,
);
register_taxonomy('wptests_case_type', array('wptests_case'), $args);
}
add_action('init', 'wptests_ru_register_case_taxonomy');Теперь в админке появится возможность создавать и назначать типы кейсов, что улучшит структуру контента и пользовательский опыт.
Отображение кастомных записей на фронтенде: шаблоны и WP_Query
Чтобы вывести список или отдельную запись созданного типа на сайте, нужно создать шаблоны в теме или использовать WP_Query.
Для списка кейсов подойдет файл archive-wptests_case.php в папке темы. В нём можно использовать стандартный цикл WordPress:
<?php get_header(); ?>
<h1>Наши кейсы</h1>
<?php if ( have_posts() ) : ?>
<ul>
<?php while ( have_posts() ) : the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php else : ?>
<p>Кейсы не найдены.</p>
<?php endif; ?>
<?php get_footer(); ?>Для выборки из кода вне шаблонов можно использовать WP_Query с параметром post_type:
$args = array(
'post_type' => 'wptests_case',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Кейсы не найдены.</p>';
}Полезные плагины для работы с собственными типами записей
Если вы не хотите писать код вручную, существуют удобные плагины для создания и управления CPT:
- Custom Post Type UI – простой интерфейс для регистрации типов записей и таксономий без кода.
- Pods – расширенный инструмент для создания CPT, таксономий и пользовательских полей с мощным API.
- Advanced Custom Fields (ACF) – позволяет создавать и выводить кастомные поля для любых типов записей, включая CPT.
Эти плагины значительно ускорят разработку и уменьшат вероятность ошибок, особенно если вы не хотите вникать в детали регистрации типов через код.
Советы по оптимизации и безопасности для собственных типов записей
Создавая CPT, важно помнить о нескольких моментах:
- Уникальные префиксы: всегда используйте уникальный префикс для идентификаторов функций и ключей CPT, чтобы избежать конфликтов с другими плагинами и темами. В примерах использован префикс
wptests_ru_. - Поддержка REST API: устанавливайте
'show_in_rest' => true, если планируете использовать Gutenberg или интегрировать данные через API. - Капабилити: при необходимости задавайте собственные права доступа для обеспечения безопасности.
- Оптимизация запросов: при выводе данных учитывайте пагинацию и индексацию для предотвращения нагрузки на сервер.
Также не забывайте проверять работу на локальной копии и использовать отладочные инструменты, чтобы выявить возможные ошибки на ранних этапах.