Кастомные типы постов (Custom Post Types, CPT) — это один из ключевых инструментов расширения возможностей WordPress. Они позволяют создавать структурированные данные, отличные от стандартных записей и страниц, что особенно полезно для сайтов с уникальным контентом, например, портфолио, каталоги товаров или мероприятия.
Что такое кастомные типы постов и зачем их автоматизировать
Кастомный тип поста — это способ организовать контент по отдельной логике, не смешивая его с обычными записями блога. Например, для сайта кинотеатра это могут быть фильмы, для сайта агентства — кейсы, для магазина — товары.
Ручное создание CPT в коде через register_post_type() требует понимания структуры и может быть трудоемким при большом количестве или частых изменениях. Автоматизация значительно упрощает этот процесс, позволяет создавать, редактировать и управлять CPT через админку или с помощью плагинов.
В этой статье подробно разберем, как автоматизировать создание кастомных типов постов, используя как плагины, так и программные решения с примерами кода.
Плагины для удобного создания кастомных типов постов
Advanced Custom Fields (ACF) и CPT UI — популярный дуэт
Плагин CPT UI позволяет создавать кастомные типы постов и таксономии через удобный интерфейс без кода. Он не отвечает за поля, но отлично справляется с регистрацией CPT.
ACF дополняет CPT UI, позволяя легко создавать и управлять пользовательскими полями для ваших типов постов.
Преимущества подхода:
- Не нужно писать код;
- Все изменения делаются через админку;
- Поддержка экспорта настроек в PHP для контроля версий.
Недостатки — зависимость от плагинов и возможное замедление сайта, если плагинов много.
Пример создания CPT через CPT UI
После установки и активации CPT UI перейдите в меню «Add/Edit Post Types» и заполните поля:
- Post Type Slug: movie
- Plural Label: Movies
- Singular Label: Movie
- Остальные настройки оставьте по умолчанию или настройте под свои нужды.
Нажмите «Add Post Type» — CPT появится в меню WordPress.
Автоматизация через код: создание функции для регистрации CPT
Если нужна максимальная гибкость и минимальная зависимость от плагинов, лучше автоматизировать регистрацию CPT программно. Создадим функцию с префиксом wptavern_ для удобства и предотвращения конфликтов.
Пример кода для регистрации кастомного типа поста "movie"
function wptavern_register_cpt_movie() {
$labels = array(
'name' => 'Movies',
'singular_name' => 'Movie',
'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' => 'movies'),
'supports' => array('title', 'editor', 'thumbnail', 'comments'),
'show_in_rest' => true,
);
register_post_type('movie', $args);
}
add_action('init', 'wptavern_register_cpt_movie');Данный код регистрирует новый тип поста с названием "movie", который поддерживает заголовок, редактор, миниатюру и комментарии. Также он включен в REST API для совместимости с Gutenberg и внешними приложениями.
Автоматизация регистрации нескольких CPT через массив
Для удобства можно создать массив с описанием нескольких типов и зарегистрировать их циклом. Это упростит добавление новых CPT в будущем.
function wptavern_register_custom_post_types() {
$post_types = array(
'movie' => array(
'singular' => 'Movie',
'plural' => 'Movies',
'slug' => 'movies',
'supports' => array('title', 'editor', 'thumbnail')
),
'book' => array(
'singular' => 'Book',
'plural' => 'Books',
'slug' => 'books',
'supports' => array('title', 'editor', 'comments')
)
);
foreach ($post_types as $type => $data) {
$labels = array(
'name' => $data['plural'],
'singular_name' => $data['singular'],
'add_new' => 'Добавить новый',
'add_new_item' => 'Добавить новый ' . strtolower($data['singular']),
'edit_item' => 'Редактировать ' . strtolower($data['singular']),
'new_item' => 'Новый ' . strtolower($data['singular']),
'view_item' => 'Просмотреть ' . strtolower($data['singular']),
'search_items' => 'Поиск ' . strtolower($data['plural']),
'not_found' => $data['plural'] . ' не найдены',
'not_found_in_trash' => 'В корзине ' . strtolower($data['plural']) . ' не найдено',
'menu_name' => $data['plural']
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => $data['slug']),
'supports' => $data['supports'],
'show_in_rest' => true,
);
register_post_type($type, $args);
}
}
add_action('init', 'wptavern_register_custom_post_types');Такой подход позволяет централизованно управлять всеми кастомными типами, легко добавлять и изменять их.
Добавление пользовательских таксономий к кастомным типам постов
Для удобной категоризации контента вместе с CPT часто нужны кастомные таксономии (например, жанры для фильмов).
Автоматизируем регистрацию таксономии с префиксом wptavern_:
function wptavern_register_taxonomy_genre() {
$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_in_rest' => true,
'rewrite' => array('slug' => 'genre')
);
register_taxonomy('genre', array('movie'), $args);
}
add_action('init', 'wptavern_register_taxonomy_genre');Здесь мы создали таксономию "genre", которая привязана к CPT "movie" и доступна в REST API.
Автоматическое добавление мета-полей для CPT через ACF или код
Чтобы расширить функционал CPT, полезно добавить мета-поля — например, дату выхода фильма, рейтинг, ссылку на трейлер.
Использование ACF для добавления мета-полей
Создайте группу полей в ACF, выберите тип записи "movie" и добавьте нужные поля (например, "release_date" — дата выхода, "rating" — рейтинг).
Для вывода в шаблоне используйте:
echo get_field('release_date');
echo get_field('rating');Добавление мета-полей вручную через код
Пример регистрации мета-поля "release_date" с префиксом wptavern_:
function wptavern_register_meta_fields() {
register_post_meta('movie', 'wptavern_release_date', array(
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'description' => 'Дата выхода фильма',
'auth_callback' => function() {
return current_user_can('edit_posts');
},
));
}
add_action('init', 'wptavern_register_meta_fields');Теперь мета-поле доступно через REST API и можно использовать в редакторах или при сохранении через код.
Пример вывода кастомного типа поста и мета-полей в шаблоне
Для вывода списка фильмов с дополнительными данными используем WP_Query:
$args = array(
'post_type' => 'movie',
'posts_per_page' => 10
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
$release_date = get_post_meta(get_the_ID(), 'wptavern_release_date', true);
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> - Выход: ' . esc_html($release_date) . '</li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo 'Фильмы не найдены';
}Этот пример демонстрирует базовое использование WP_Query для вывода кастомного контента с мета-полями.
Советы по автоматизации и поддержке кастомных типов постов
- Используйте префиксы для функций и мета-полей, чтобы избежать конфликтов. В нашем случае —
wptavern_. - Сохраняйте регистрацию CPT и таксономий в отдельном файле, подключаемом через functions.php.
- Экспортируйте настройки плагинов CPT UI и ACF в PHP для контроля версий и развертывания на других сайтах.
- Не забывайте о поддержке REST API, если планируете использовать Gutenberg или внешние приложения.
- Тестируйте изменения на локальной копии, чтобы не сломать рабочий сайт.