Создание собственного типа записей (Custom Post Type, CPT) — один из основных способов расширить функциональность WordPress под конкретные задачи. В этой статье мы подробно рассмотрим, как зарегистрировать CPT, настройку его параметров, подключение к шаблонам сайта и интеграцию с популярными плагинами. Все примеры основаны на практике и снабжены кодом для вставки.
Что такое собственный тип записей в WordPress и зачем он нужен
По умолчанию WordPress содержит несколько типов записей: post (записи), page (страницы), attachment (вложения) и др. Однако для организации специфического контента, например портфолио, отзывов, продуктов или мероприятий, удобнее создать отдельный тип записей. Это позволит:
- Отделить контент логически и визуально от обычных записей и страниц;
- Настроить отдельные метаданные, таксономии и шаблоны отображения;
- Упростить управление контентом в админке;
- Интегрировать с плагинами, поддерживающими CPT.
Таким образом, CPT — это мощный инструмент для кастомизации сайта под любые бизнес-задачи.
Регистрация собственного типа записей: пример кода
Для регистрации CPT нужно использовать функцию register_post_type(). Обычно вызов помещают в хук init. Ниже пример создания CPT «Портфолио» с базовыми настройками.
function yarpp_register_portfolio_cpt() {
$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' => 'portfolio'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'comments'),
'show_in_rest' => true,
);
register_post_type('yarpp_portfolio', $args);
}
add_action('init', 'yarpp_register_portfolio_cpt');Обратите внимание на ключевые параметры:
labels— набор названий для интерфейса админки;public— делает тип видимым на сайте и в админке;rewrite— настройка ЧПУ (человекопонятных URL);supports— какие стандартные возможности поддерживает тип (заголовок, редактор, миниатюры и т.д.);show_in_rest— включение поддержки REST API и Гутенберга.
Настройка таксономий и метаполей для CPT
Чтобы расширить функциональность, к CPT можно добавить собственные таксономии (категории, метки) и произвольные поля (метаполя).
Добавление таксономий
Например, создадим таксономию «Тип проекта» для нашего портфолио:
function yarpp_register_portfolio_taxonomies() {
$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' => 'project-type'),
'show_in_rest' => true,
);
register_taxonomy('yarpp_project_type', array('yarpp_portfolio'), $args);
}
add_action('init', 'yarpp_register_portfolio_taxonomies');Теперь в админке появится удобный фильтр и возможность группировать проекты по типам.
Добавление метаполей
Для добавления дополнительных данных к записи CPT удобно использовать метаполя. Можно использовать плагины (например, Advanced Custom Fields), но ниже пример простого добавления метаполя с кодом.
Добавим поле «Год создания проекта».
function yarpp_add_portfolio_meta_boxes() {
add_meta_box(
'yarpp_portfolio_year',
'Год создания проекта',
'yarpp_portfolio_year_meta_box_callback',
'yarpp_portfolio',
'side'
);
}
add_action('add_meta_boxes', 'yarpp_add_portfolio_meta_boxes');
function yarpp_portfolio_year_meta_box_callback($post) {
wp_nonce_field('yarpp_save_portfolio_year', 'yarpp_portfolio_year_nonce');
$value = get_post_meta($post->ID, '_yarpp_portfolio_year', true);
echo '<label for="yarpp_portfolio_year_field">Введите год:</label> ';
echo '<input type="number" id="yarpp_portfolio_year_field" name="yarpp_portfolio_year_field" value="' . esc_attr($value) . '" size="4" />';
}
function yarpp_save_portfolio_year($post_id) {
if (!isset($_POST['yarpp_portfolio_year_nonce']) || !wp_verify_nonce($_POST['yarpp_portfolio_year_nonce'], 'yarpp_save_portfolio_year')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['yarpp_portfolio_year_field'])) {
$year = intval($_POST['yarpp_portfolio_year_field']);
update_post_meta($post_id, '_yarpp_portfolio_year', $year);
}
}
add_action('save_post', 'yarpp_save_portfolio_year');Теперь при редактировании проекта появится поле для ввода года, которое сохранится и может использоваться в шаблонах.
Вывод собственных типов записей на сайте
Чтобы вывести CPT на фронтенде, можно создать отдельный шаблон архива и одиночной записи. Для архива создайте файл archive-yarpp_portfolio.php в папке вашей темы, для одиночной записи — single-yarpp_portfolio.php.
Пример простого цикла вывода архива портфолио:
<?php
$args = array(
'post_type' => 'yarpp_portfolio',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post(); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div><?php the_excerpt(); ?></div>
<?php endwhile;
wp_reset_postdata();
else :
echo '<p>Проекты не найдены.</p>';
endif;
?>Для одиночной записи используйте стандартные функции WordPress, например the_title(), the_content(), а для метаполей — get_post_meta():
<?php
$year = get_post_meta(get_the_ID(), '_yarpp_portfolio_year', true);
echo '<p>Год создания: ' . esc_html($year) . '</p>';
?>Интеграция CPT с популярными плагинами
Большинство современных плагинов (например, SEO, кеширования, визуальных редакторов) автоматически поддерживают пользовательские типы записей, если они зарегистрированы корректно. Однако некоторые требуют дополнительной настройки.
Yoast SEO и пользовательские типы записей
Чтобы включить CPT в карту сайта и управление SEO, в настройках Yoast SEO нужно разрешить отображение и индексацию для вашего типа. Для этого зайдите в раздел «Поисковый внешний вид» > «Типы записей» и выберите нужные опции.
Кеширование и CPT
При использовании кеширующих плагинов (WP Super Cache, W3 Total Cache) важно убедиться, что правила перезаписи для CPT работают корректно и кеш обновляется при изменении записей. Рекомендуется очищать кеш после добавления или редактирования CPT.
Визуальные редакторы и конструкторы страниц
Поддержка Gutenberg и других визуальных редакторов включается через параметр show_in_rest. Для популярных конструкторов (Elementor, Beaver Builder) CPT автоматически доступны, если они публичные и отображаются в меню.
Полезные советы и рекомендации при работе с CPT
- Всегда используйте уникальный префикс для функций и идентификаторов (в нашей статье —
yarpp_) для избежания конфликтов. - Поддерживайте совместимость с REST API, это упрощает интеграцию и использование блоков Гутенберга.
- Не забудьте создать пользовательские шаблоны для правильного вывода контента.
- Внимательно тестируйте работу таксономий и метаполей, чтобы не было ошибок при сохранении и выводе.
- Используйте хуки и фильтры WordPress для расширения функционала CPT без прямого изменения кода плагинов и темы.