Создание собственного типа записи (Custom Post Type, CPT) – одна из ключевых возможностей WordPress, позволяющая расширить стандартный функционал сайта и адаптировать его под конкретные задачи. В этой статье мы подробно разберём, как правильно создать и настроить CPT, какие параметры доступны, а также приведём практические примеры кода для использования в вашем сайте на WordPress.
Что такое собственный тип записи в WordPress и зачем он нужен
Стандартный WordPress предлагает несколько типов записей: записи (posts), страницы (pages), вложения (attachments) и несколько других. Однако часто для реализации специфичных функций сайта – например, каталог товаров, портфолио, отзывы или мероприятия – требуется отдельный тип контента с собственными полями и поведением.
Собственный тип записи позволяет хранить и управлять таким контентом отдельно, улучшая организацию данных и удобство администрирования. Это особенно важно для крупных проектов, где нужно чётко разделять разные виды информации.
Кроме того, CPT хорошо интегрируется с таксономиями (категории, метки), поддерживает архивы и может иметь собственные шаблоны отображения на фронтенде.
Как зарегистрировать собственный тип записи в WordPress
Регистрация CPT реализуется через функцию register_post_type(). Обычно этот код добавляют в файл functions.php вашей темы или в отдельный плагин.
Рассмотрим пример регистрации типа записи «Книги» (books):
function wp_lessons_register_cpt_books() {
$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,
'has_archive' => true,
'rewrite' => array('slug' => 'books'),
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'show_in_rest' => true,
);
register_post_type('wp_lessons_books', $args);
}
add_action('init', 'wp_lessons_register_cpt_books');В этом примере мы создаём CPT с названием wp_lessons_books, указываем метки для интерфейса администратора, делаем тип публичным и включаем поддержку редактора, миниатюр и кастомных полей.
Параметр show_in_rest включён для поддержки редактора Gutenberg и REST API.
Настройка таксономий для собственного типа записи
Чтобы структурировать контент CPT, часто создают собственные таксономии (категории, метки). Например, для «Книг» можно добавить таксономию «Жанры».
Пример регистрации таксономии:
function wp_lessons_register_taxonomy_genres() {
$labels = array(
'name' => 'Жанры',
'singular_name' => 'Жанр',
'search_items' => 'Поиск жанров',
'all_items' => 'Все жанры',
'edit_item' => 'Редактировать жанр',
'add_new_item' => 'Добавить новый жанр',
'menu_name' => 'Жанры',
);
$args = array(
'hierarchical' => true, // работает как категории
'labels' => $labels,
'show_ui' => true,
'show_in_rest' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'genre'),
);
register_taxonomy('wp_lessons_genre', array('wp_lessons_books'), $args);
}
add_action('init', 'wp_lessons_register_taxonomy_genres');Теперь в админке появится удобный интерфейс для управления жанрами, а пользователи смогут фильтровать книги по жанрам на фронтенде.
Как вывести собственный тип записи на сайте
Для отображения CPT на сайте нужно создать шаблоны в вашей теме. WordPress автоматически ищет файлы с именами archive-{post_type}.php для архивов и single-{post_type}.php для одиночных записей.
В нашем случае это будут archive-wp_lessons_books.php и single-wp_lessons_books.php.
Пример простого шаблона архива (archive-wp_lessons_books.php):
<?php get_header(); ?>
<main>
<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; ?>
</main>
<?php get_footer(); ?>Для одиночной страницы можно вывести дополнительные метаданные и таксономии.
Использование кастомных полей и мета-боксов для CPT
Часто для собственного типа записи нужны дополнительные данные, например, автор книги, год издания, рейтинг и т. д. Для этого используют кастомные поля и мета-боксы.
Рассмотрим пример добавления мета-бокса с полем «Год издания» для CPT «Книги»:
function wp_lessons_add_books_meta_box() {
add_meta_box(
'wp_lessons_books_year',
'Год издания',
'wp_lessons_books_year_meta_box_callback',
'wp_lessons_books',
'side'
);
}
add_action('add_meta_boxes', 'wp_lessons_add_books_meta_box');
function wp_lessons_books_year_meta_box_callback($post) {
wp_nonce_field('wp_lessons_save_books_year_data', 'wp_lessons_books_year_nonce');
$value = get_post_meta($post->ID, '_wp_lessons_books_year', true);
echo '<label for="wp_lessons_books_year_field">Введите год:</label> ';
echo '<input type="number" id="wp_lessons_books_year_field" name="wp_lessons_books_year_field" value="' . esc_attr($value) . '" size="4" />';
}
function wp_lessons_save_books_year_data($post_id) {
if (!isset($_POST['wp_lessons_books_year_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wp_lessons_books_year_nonce'], 'wp_lessons_save_books_year_data')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wp_lessons_books_year_field'])) {
$year = sanitize_text_field($_POST['wp_lessons_books_year_field']);
update_post_meta($post_id, '_wp_lessons_books_year', $year);
}
}
add_action('save_post', 'wp_lessons_save_books_year_data');После добавления этого кода в админке при редактировании книги появится поле для ввода года издания. Данные сохраняются и могут быть выведены на сайте.
Вывод данных собственного типа записи с кастомными полями на фронтенде
Чтобы вывести дополнительное поле в шаблоне одиночной записи, используйте функцию get_post_meta():
<?php
$year = get_post_meta(get_the_ID(), '_wp_lessons_books_year', true);
if ($year) {
echo '<p><strong>Год издания:</strong> ' . esc_html($year) . '</p>';
}
?>Так можно добавить любые мета-данные, расширяя возможности отображения контента.
Рекомендации и полезные плагины для работы с CPT
Если вы не хотите писать код вручную, существуют плагины, упрощающие создание и управление CPT и таксономиями:
- Custom Post Type UI – удобный интерфейс для регистрации типов записей и таксономий без кода.
- Advanced Custom Fields (ACF) – мощный инструмент для создания и управления кастомными полями и мета-боксами.
- Pods – комплексное решение для создания CPT, таксономий и пользовательских полей с расширенными возможностями.
Однако, знание базового подхода с кодом всегда пригодится для тонкой настройки и оптимизации проекта.
Заключение
Создание собственного типа записи в WordPress – это эффективный способ структурировать и расширить функциональность сайта. Благодаря CPT можно реализовать практически любой тип контента с удобным управлением и гибкой настройкой отображения. Используя приведённые примеры и рекомендации, вы сможете создавать качественные и удобные решения под свои задачи.