В WordPress стандартно доступны такие типы записей, как записи (posts) и страницы (pages). Однако часто возникает необходимость добавить собственный тип записи (Custom Post Type, CPT) для хранения уникального контента — например, портфолио, отзывы, мероприятия или товары. В этой статье подробно разберём, как создать и настроить собственный тип записи в WordPress, чтобы он полноценно работал с административной панелью и фронтендом сайта.
Почему стоит использовать собственные типы записей
Использование CPT помогает структурировать контент и отделить его от обычных записей. Это упрощает управление, фильтрацию и отображение данных. Например, если у вас сайт-уроки WordPress (как wpurok.ru), вы можете создать тип записи «Урок» с уникальными полями и таксономиями.
Без CPT вам пришлось бы использовать метки или категории, что не всегда удобно и логично. CPT позволяет сделать интерфейс администратору проще, а для разработчиков — получить удобный API.
Регистрация собственного типа записи с помощью функции wpurok_register_custom_post_type()
Чтобы зарегистрировать новый тип записи, нужно использовать функцию register_post_type(). Желательно делать это в хуке init. Ниже пример создания CPT «Урок».
function wpurok_register_custom_post_type() {
$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,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'urok'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments')
);
register_post_type('urok', $args);
}
add_action('init', 'wpurok_register_custom_post_type');
В этом коде создаётся новый тип записи с названием «Урок» в панели администратора, доступный для публичного отображения. Параметр supports задаёт, какие стандартные возможности записи включить (заголовок, редактор, миниатюра и т.д.).
Добавление пользовательских таксономий для собственного типа записи
Для удобства категоризации уроков добавим таксономию «Тип урока». Это можно сделать с помощью функции register_taxonomy(). Пример:
function wpurok_register_custom_taxonomy() {
$labels = array(
'name' => 'Типы уроков',
'singular_name' => 'Тип урока',
'search_items' => 'Поиск типов уроков',
'all_items' => 'Все типы уроков',
'edit_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' => 'tip-uroka'),
);
register_taxonomy('tip_uroka', array('urok'), $args);
}
add_action('init', 'wpurok_register_custom_taxonomy');
После добавления этого кода в админке появится меню для управления типами уроков, которые можно будет назначать к урокам.
Вывод кастомных типов записей на фронтенде с WP_Query
Для отображения уроков на сайте используем класс WP_Query. Например, выводим список последних 5 уроков определённого типа:
$args = array(
'post_type' => 'urok',
'posts_per_page' => 5,
'tax_query' => array(
array(
'taxonomy' => 'tip_uroka',
'field' => 'slug',
'terms' => 'video', // например, тип урока видео
),
),
);
$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>';
} else {
echo 'Уроки не найдены.';
}
wp_reset_postdata();
Такой код можно вставить в шаблон темы или в пользовательский шорткод.
Важные нюансы и советы по работе с CPT
При создании CPT стоит обратить внимание на несколько важных моментов:
- ЧПУ (Permalinks): После регистрации нового типа записи нужно обновить настройки постоянных ссылок (Перейти в «Настройки» – «Постоянные ссылки» и нажать «Сохранить»). Иначе ссылки могут выдавать 404.
- Права доступа: Если нужно ограничить доступ по ролям, можно использовать параметр
capabilitiesи дополнительные плагины для управления правами. - Поддержка REST API: Чтобы использовать CPT в Gutenberg или внешних приложениях, задайте
'show_in_rest' => trueв аргументахregister_post_type(). - Стили и скрипты: Для кастомных метабоксов и интерфейсов подключайте свои стили и скрипты через
admin_enqueue_scripts.
Пример расширения: добавление метабокса с произвольным полем
Добавим метабокс, который позволит вводить длительность урока в минутах.
function wpurok_add_duration_metabox() {
add_meta_box(
'wpurok_duration',
'Длительность урока (минуты)',
'wpurok_duration_metabox_callback',
'urok',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpurok_add_duration_metabox');
function wpurok_duration_metabox_callback($post) {
wp_nonce_field('wpurok_save_duration', 'wpurok_duration_nonce');
$value = get_post_meta($post->ID, '_wpurok_duration', true);
echo '<label for="wpurok_duration_field">Введите длительность:</label> ';
echo '<input type="number" id="wpurok_duration_field" name="wpurok_duration_field" value="' . esc_attr($value) . '" min="1" style="width:100%" />';
}
function wpurok_save_duration_metabox($post_id) {
if (!isset($_POST['wpurok_duration_nonce']) || !wp_verify_nonce($_POST['wpurok_duration_nonce'], 'wpurok_save_duration')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpurok_duration_field'])) {
update_post_meta($post_id, '_wpurok_duration', intval($_POST['wpurok_duration_field']));
}
}
add_action('save_post', 'wpurok_save_duration_metabox');
Теперь при редактировании урока появится поле для ввода длительности. Это можно использовать при выводе урока на сайте.
Заключение
Создание собственного типа записи — мощный инструмент для структурирования контента в WordPress. Приведённые примеры кода помогут вам быстро добавить CPT, таксономии и расширить их функционал метабоксами. Для упрощения работы с CPT также можно рассмотреть плагины, например, Clearfy Pro, который предлагает удобный интерфейс и дополнительные опции для кастомизации.
Используйте эти инструменты, чтобы сделать ваш сайт на WordPress более удобным и функциональным.