В WordPress по умолчанию есть несколько типов записей: записи (posts), страницы (pages), вложения (attachments) и другие. Но часто для реализации специфического функционала необходимо создать собственный тип записи — Custom Post Type (CPT). В этой статье подробно разберём, как правильно зарегистрировать, настроить и использовать CPT с примерами кода и полезными советами.
Что такое Custom Post Type и зачем он нужен
Custom Post Type — это расширение стандартных типов контента WordPress, которое позволяет создавать свои уникальные сущности. Например, если вы ведёте сайт с обзорами книг, можно создать тип записи «Книга» с собственными полями, таксономиями и шаблонами отображения.
Преимущества использования CPT:
- Структурирование контента по разным категориям;
- Упрощение администрирования и поиска нужной информации;
- Возможность создавать различные шаблоны отображения;
- Более гибкая организация сайта без необходимости создавать отдельные сайты или использовать сложные плагины.
Как создать Custom Post Type в WordPress: базовый пример
Для регистрации нового типа записи используется функция register_post_type(), которую нужно вызвать на хуке init. Рассмотрим пример создания типа записи «Книга».
function wp2_create_book_cpt() {
$labels = array(
'name' => 'Книги',
'singular_name' => 'Книга',
'add_new' => 'Добавить книгу',
'add_new_item' => 'Добавить новую книгу',
'edit_item' => 'Редактировать книгу',
'new_item' => 'Новая книга',
'all_items' => 'Все книги',
'view_item' => 'Просмотреть книгу',
'search_items' => 'Искать книги',
'not_found' => 'Книги не найдены',
'not_found_in_trash' => 'В корзине книги не найдены',
'menu_name' => 'Книги'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'books'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-book',
);
register_post_type('book', $args);
}
add_action('init', 'wp2_create_book_cpt');Данный код добавит в админ-панель новый раздел «Книги» с поддержкой редактора, миниатюр и метаполей.
Настройка таксономий для Custom Post Type
Для удобной организации контента рекомендуется создавать свои таксономии (категории, теги). Для CPT «Книга» можно добавить таксономию «Жанр».
function wp2_create_book_taxonomies() {
$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,
'rewrite' => array('slug' => 'genre'),
);
register_taxonomy('genre', array('book'), $args);
}
add_action('init', 'wp2_create_book_taxonomies');Теперь у каждой книги можно будет назначать жанры, что позволит фильтровать и сортировать записи по этим параметрам.
Добавление пользовательских полей с помощью плагина Advanced Custom Fields
Для расширения данных CPT удобно использовать плагин Advanced Custom Fields (ACF). Он позволяет создавать удобный интерфейс для добавления дополнительных метаданных, таких как автор, год издания, рейтинг и т.д.
После установки плагина:
- Создайте группу полей, например «Данные книги».
- Добавьте поля: текстовое поле «Автор», число «Год издания» и рейтинг.
- Настройте правила показа — группа должна отображаться для типа записи «Книга».
В шаблоне для отображения книги выведете данные так:
<?php
$author = get_field('author');
$year = get_field('year');
$rating = get_field('rating');
echo '<p>Автор: '.esc_html($author).'</p>';
echo '<p>Год издания: '.intval($year).'</p>';
echo '<p>Рейтинг: '.floatval($rating).'</p>';
?>Создание кастомных шаблонов для Custom Post Type
Чтобы отдельный тип записи отображался уникально, можно создать шаблон single-book.php в вашей теме. WordPress автоматически подхватит его для отображения записи типа «book».
Пример минимального файла single-book.php:
<?php
get_header();
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h1><?php the_title(); ?></h1>
<div class="content"><?php the_content(); ?></div>
<?php
echo '<p>Автор: '.esc_html(get_field('author')).'</p>';
echo '<p>Год издания: '.intval(get_field('year')).'</p>';
?>
<?php endwhile; endif; get_footer(); ?>Так вы сможете полностью контролировать вывод данных и стиль отображения.
Обработка запросов и фильтрация Custom Post Type в admin
Для удобства управления CPT в админке можно добавить фильтры по своим таксономиям или метаполям. Например, фильтр по жанру в списке книг.
Для этого воспользуемся хуками restrict_manage_posts и pre_get_posts. Пример кода:
function wp2_filter_books_by_genre() {
global $typenow;
if ($typenow == 'book') {
$taxonomy = 'genre';
$selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
wp_dropdown_categories(array(
'show_option_all' => 'Все жанры',
'taxonomy' => $taxonomy,
'name' => $taxonomy,
'orderby' => 'name',
'selected' => $selected,
'hide_empty' => false,
));
}
}
add_action('restrict_manage_posts', 'wp2_filter_books_by_genre');
function wp2_filter_books_query($query) {
global $pagenow;
$type = isset($_GET['post_type']) ? $_GET['post_type'] : '';
if ($pagenow == 'edit.php' && $type == 'book' && isset($_GET['genre']) && is_numeric($_GET['genre'])) {
$term = intval($_GET['genre']);
$query->query_vars['tax_query'] = array(
array(
'taxonomy' => 'genre',
'field' => 'term_id',
'terms' => $term,
)
);
}
}
add_filter('pre_get_posts', 'wp2_filter_books_query');Полезные плагины для работы с Custom Post Types
Если вы не хотите писать код, на 2wp.ru и в репозитории WordPress есть хорошие плагины для создания CPT:
- Custom Post Type UI — удобный интерфейс для создания и редактирования типов записи и таксономий без кода.
- Advanced Custom Fields — для расширения данных CPT удобными метаполями.
- Toolset Types — мощный инструмент для комплексного создания CPT и родственных сущностей.
Используйте эти плагины, если нужно быстро организовать структуру сайта, не углубляясь в программирование.
Советы по оптимизации и безопасности при работе с CPT
При создании собственных типов записей важно учесть производительность и безопасность:
- Регистрируйте CPT и таксономии с правильными параметрами, избегайте лишних возможностей, если они не нужны.
- Используйте
show_in_restдля поддержки Gutenberg и REST API, если планируете работу с блоками и внешними приложениями. - При выводе пользовательских данных применяйте функции экранирования
esc_html(),esc_attr()и т.п. - Если добавляете метаполя вручную, используйте nonce и проверки прав для сохранения безопасности.
- Оптимизируйте запросы с помощью правильных индексов в базе и кеширования.
Соблюдение этих рекомендаций поможет избежать проблем и обеспечит стабильную работу сайта.