Что такое собственный тип записей (Custom Post Type) в WordPress
WordPress изначально построен на базе типовой структуры, где основными элементами контента являются записи (posts) и страницы (pages). Однако для более сложных проектов часто требуется организовать контент в отдельные типы, которые имеют свои уникальные свойства и поведение. Именно для этого и существуют собственные типы записей (Custom Post Types, CPT).
CPT позволяют создавать отдельные разделы сайта, например, портфолио, отзывы, события, товары и пр., с отдельным набором полей и логикой отображения. Это значительно расширяет возможности WordPress как CMS и позволяет сделать структуру сайта более удобной как для пользователя, так и для администрирования.
В этой статье мы рассмотрим, как создать собственный тип записей вручную через код, а также с помощью популярных плагинов, а также разберём, как добавить мета-поля и вывести данные CPT на фронтенде.
Регистрация собственного типа записей вручную: пример кода
Для регистрации CPT используется функция register_post_type(), которую нужно вызвать в хуке init. Ниже приведён простой пример создания типа записей «События».
function wpticket_register_events_cpt() {
$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' => 'events'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'comments'),
'menu_position' => 5,
'menu_icon' => 'dashicons-calendar',
'show_in_rest' => true
);
register_post_type('wpticket_event', $args);
}
add_action('init', 'wpticket_register_events_cpt');В этом коде мы создали CPT с уникальным идентификатором wpticket_event, добавили пользовательские метки для удобства в админке, указали поддержку заголовка, редактора, миниатюры и комментариев, а также сделали его доступным в REST API для работы с Gutenberg и внешними приложениями.
После добавления этого кода в файл functions.php вашей темы или в собственный плагин, в админке появится новый раздел «События», где можно добавлять и редактировать записи этого типа.
Добавление пользовательских мета-полей для CPT
Для расширения функционала CPT часто необходимо добавить дополнительные поля, например, дату проведения события, место или цену. Это можно сделать вручную, добавив мета-боксы в редактор или воспользовавшись плагинами.
Ручное добавление мета-бокса
Пример создания мета-бокса для даты события:
function wpticket_add_event_meta_box() {
add_meta_box(
'wpticket_event_date',
'Дата события',
'wpticket_event_date_callback',
'wpticket_event',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpticket_add_event_meta_box');
function wpticket_event_date_callback($post) {
wp_nonce_field('wpticket_save_event_date', 'wpticket_event_date_nonce');
$value = get_post_meta($post->ID, '_wpticket_event_date', true);
echo '<input type="date" id="wpticket_event_date" name="wpticket_event_date" value="' . esc_attr($value) . '" />';
}
function wpticket_save_event_date_meta($post_id) {
if (!isset($_POST['wpticket_event_date_nonce']) || !wp_verify_nonce($_POST['wpticket_event_date_nonce'], 'wpticket_save_event_date')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpticket_event_date'])) {
update_post_meta($post_id, '_wpticket_event_date', sanitize_text_field($_POST['wpticket_event_date']));
}
}
add_action('save_post', 'wpticket_save_event_date_meta');Этот код добавляет в боковую панель редактора поля для ввода даты, сохраняет её при сохранении записи и выводит в защищённом виде. Аналогично можно добавить и другие поля.
Использование плагинов для создания и управления CPT
Если не хочется писать код, можно воспользоваться популярными плагинами, которые значительно упрощают создание CPT и мета-полей:
- Custom Post Type UI — удобный интерфейс для регистрации CPT и таксономий без кода.
- Advanced Custom Fields (ACF) — мощный инструмент для создания любых мета-полей с гибкой логикой отображения.
Сначала создайте CPT через Custom Post Type UI, затем с помощью ACF добавьте необходимые поля, которые будут автоматически отображаться в редакторе. Такой подход подходит для пользователей без опыта программирования и для быстрого прототипирования.
Вывод данных собственного типа записей на сайте
Чтобы вывести список или отдельные записи CPT на сайте, можно использовать WP_Query с фильтрацией по типу записей.
$args = array(
'post_type' => 'wpticket_event',
'posts_per_page' => 10,
'meta_key' => '_wpticket_event_date',
'orderby' => 'meta_value',
'order' => 'ASC'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
$date = get_post_meta(get_the_ID(), '_wpticket_event_date', true);
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> — ' . esc_html($date) . '</li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Событий не найдено.</p>';
}Этот пример выводит 10 ближайших по дате событий, используя мета-поле даты для сортировки. Такой код можно вставить в шаблон темы или виджет.
Полезные рекомендации и советы
При создании CPT учитывайте следующее:
- Всегда используйте уникальный префикс в идентификаторах и названиях функций, чтобы избежать конфликтов — например,
wpticket_. - Добавляйте поддержку REST API (
show_in_rest => true) для совместимости с блоковым редактором и внешними сервисами. - Оптимизируйте запросы WP_Query, чтобы не перегружать сайт.
- Используйте таксономии для удобной категоризации и фильтрации CPT.
Создание собственных типов записей — это мощный инструмент для расширения функционала WordPress и адаптации под задачи любого проекта. Главное — делать это грамотно и структурированно.