Пользовательские типы записей (Custom Post Types, CPT) — мощный инструмент WordPress, позволяющий расширить стандартные возможности сайта и создавать уникальные структуры контента. В этой статье мы подробно разберем, как создать собственный тип записи в WordPress, какие параметры важны для настройки и как использовать CPT в шаблонах темы.
Что такое пользовательский тип записи и зачем он нужен
WordPress по умолчанию поддерживает несколько типов записей: посты, страницы, вложения, ревизии и т.д. Однако для многих проектов этого недостаточно. Например, если вы создаете сайт с каталогом товаров, портфолио, отзывами или событиями, вам удобнее организовать контент с помощью отдельных типов записей.
Пользовательский тип записи позволяет:
- Разделять контент по смыслу и структуре, не смешивая с обычными постами.
- Назначать отдельные мета-поля, таксономии и шаблоны отображения.
- Упростить администрирование и управление контентом для редакторов.
Создание CPT — базовый навык для разработчика тем и плагинов WordPress, который значительно повышает гибкость и масштабируемость проекта.
Регистрация собственного типа записи с помощью функции wpfreecourses_register_custom_post_type
Для создания пользовательского типа записи в WordPress используется функция register_post_type(). Мы создадим обертку wpfreecourses_register_custom_post_type, чтобы показать пример правильной инициализации.
function wpfreecourses_register_custom_post_type() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'view_item' => 'Просмотреть отзыв',
'search_items' => 'Поиск отзывов',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывов не найдено',
'menu_name' => 'Отзывы'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'otzyvy'),
'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
'show_in_rest' => true // Включаем поддержку Gutenberg
);
register_post_type('wpfreecourses_review', $args);
}
add_action('init', 'wpfreecourses_register_custom_post_type');В этом примере мы создали тип записи «Отзывы» с базовыми настройками. Обратите внимание на параметр supports, который определяет, какие стандартные возможности будут доступны для записей данного типа.
Пояснения к параметрам
labels — массив текстов интерфейса, которые отображаются в админке WordPress. Их стоит перевести и адаптировать под ваш проект.
public — определяет, будет ли тип записи доступен на фронтенде и в административной части.
has_archive — включение архивной страницы типа записи.
rewrite — настройка правил ЧПУ (человекопонятного урла). В данном случае записи будут доступны по адресу example.com/otzyvy/название-записи.
supports — включает стандартные метабоксы и функционал редактора для данного типа записи.
show_in_rest — необходим для поддержки редактора Gutenberg и REST API.
Добавление пользовательских таксономий для нового типа записи
Чтобы расширить возможности фильтрации и группировки, полезно добавить пользовательские таксономии (например, категории или теги) для нового типа записи.
Рассмотрим создание таксономии «Тип отзыва» для нашего CPT «Отзывы».
function wpfreecourses_register_review_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' => 'review-type'),
'show_in_rest' => true
);
register_taxonomy('wpfreecourses_review_type', array('wpfreecourses_review'), $args);
}
add_action('init', 'wpfreecourses_register_review_taxonomy');Таксономия с параметром hierarchical = true ведет себя как категории, позволяя создавать вложенные термины.
Использование пользовательского типа записи в шаблонах темы
После регистрации CPT, чтобы вывести записи на сайте, нужно создать шаблон. Например, для архива отзывов можно создать файл archive-wpfreecourses_review.php в папке темы.
Пример базового цикла вывода:
<?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>
<p><?php the_excerpt(); ?></p>
</li>
<?php endwhile; ?>
</ul>
<?php the_posts_pagination(); ?>
<?php else : ?>
<p>Отзывы не найдены.</p>
<?php endif; ?>
<?php get_footer(); ?>Такой шаблон позволит красиво вывести список ваших отзывов с пагинацией.
Вывод пользовательских полей и таксономий
Если вы добавляли мета-поля (например, рейтинг), вывести их можно так:
echo '<p>Рейтинг: ' . esc_html(get_post_meta(get_the_ID(), 'wpfreecourses_review_rating', true)) . '</p>';Для вывода таксономий используйте:
the_terms(get_the_ID(), 'wpfreecourses_review_type', 'Тип: ', ', ');Добавление пользовательских мета-полей для расширения функционала
Часто пользовательского контента мало — нужно добавить специфичные данные. Для этого применяются мета-поля.
Рассмотрим пример добавления поля «Рейтинг» для отзывов с использованием стандартного API мета-полей.
Добавим метабокс:
function wpfreecourses_add_review_meta_box() {
add_meta_box(
'wpfreecourses_review_rating',
'Рейтинг отзыва',
'wpfreecourses_review_rating_meta_box_callback',
'wpfreecourses_review',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpfreecourses_add_review_meta_box');
function wpfreecourses_review_rating_meta_box_callback($post) {
$value = get_post_meta($post->ID, 'wpfreecourses_review_rating', true);
echo '<label for="wpfreecourses_review_rating_field">Рейтинг (от 1 до 5):</label> ';
echo '<input type="number" id="wpfreecourses_review_rating_field" name="wpfreecourses_review_rating_field" value="' . esc_attr($value) . '" min="1" max="5" />';
}
function wpfreecourses_save_review_meta_box_data($post_id) {
if (!isset($_POST['wpfreecourses_review_rating_field'])) {
return;
}
$rating = sanitize_text_field($_POST['wpfreecourses_review_rating_field']);
update_post_meta($post_id, 'wpfreecourses_review_rating', $rating);
}
add_action('save_post', 'wpfreecourses_save_review_meta_box_data');Теперь при редактировании отзыва можно указать рейтинг и вывести его в шаблоне.
Советы по оптимизации и безопасности при работе с CPT
При создании собственных типов записей важно соблюдать несколько правил:
- Используйте префиксы в названиях функций и мета-ключей, чтобы избежать конфликтов (как в нашем случае с
wpfreecourses_). - Всегда проверяйте и санитизируйте вводимые данные перед сохранением.
- Добавляйте поддержку REST API, если планируете интеграции с внешними сервисами или Gutenberg.
- Продумывайте архитектуру таксономий и мета-полей заранее, чтобы избежать избыточности.
- Используйте правильные хуки для регистрации CPT — обычно это
init.
Заключение: расширяем возможности WordPress с CPT
Создание собственных типов записей — это один из самых эффективных способов адаптировать WordPress под уникальные задачи. С помощью CPT, пользовательских таксономий и мета-полей вы можете построить сложную и удобную структуру контента, простую для управления и масштабируемую.
Приведенный пример наглядно показывает, как с минимальными усилиями реализовать новую сущность «Отзывы» и интегрировать её в админку и фронтенд сайта. Освоив этот навык, вы сможете создавать каталоги, портфолио, события и многое другое, не ограничиваясь стандартными возможностями WordPress.