WordPress изначально ориентирован на работу с постами и страницами, но часто возникает необходимость создавать собственные типы записей — Custom Post Types (CPT). Они позволяют организовать контент более гибко и структурированно, например, для портфолио, отзывов, каталогов товаров или событий. В этой статье мы разберём, как правильно создать и использовать собственный Post Type в WordPress, какие есть лучшие практики и полезные плагины.
Что такое Custom Post Type и зачем он нужен в WordPress
Custom Post Type — это пользовательский тип записи, который расширяет стандартные возможности WordPress. Он позволяет создавать отдельные сущности с собственным набором полей, таксономий и логикой отображения. Это особенно удобно, если на сайте нужно структурировать контент по тематике или функционалу, отличному от обычных записей и страниц.
Например, если вы ведёте сайт кинотеатра, вам может понадобиться тип записи «Фильмы» с полями для режиссёра, года выпуска, жанра и т.д. Используя CPT, вы сможете легко создать отдельный раздел для этих данных, не смешивая их с блог-постами.
Кроме того, CPT отлично интегрируются с таксономиями и метаполями, что позволяет сделать админку и публичную часть сайта максимально удобными.
Создание собственного Post Type вручную через functions.php
Самый базовый способ создать CPT — добавить код в файл functions.php вашей темы или, что лучше, в отдельный плагин. Ниже пример создания простого типа записи «Проекты».
function wp_puzzle_register_post_type_projects() {
$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' => 'projects'),
'show_in_rest' => true, // для поддержки Gutenberg
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
);
register_post_type('wp_puzzle_projects', $args);
}
add_action('init', 'wp_puzzle_register_post_type_projects');Обратите внимание, что мы использовали префикс wp_puzzle_ в названии функции и типа записи — это хорошая практика для избежания конфликтов.
В этом коде:
- labels — задают названия в админке;
- public — делает тип записи видимым на сайте и в админке;
- has_archive — включает архивную страницу с URL
site.ru/projects; - rewrite — настраивает ЧПУ (человеко-понятный URL);
- show_in_rest — позволяет редактировать записи CPT в редакторе Gutenberg;
- supports — определяет, какие стандартные поля доступны (заголовок, редактор, миниатюра и т.д.).
Добавление кастомных таксономий для Custom Post Type
Для удобной категоризации и фильтрации CPT можно добавить пользовательские таксономии. Например, для проекта можно создать таксономию «Тип проекта».
function wp_puzzle_register_taxonomy_project_type() {
$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' => 'project-type'),
'show_in_rest' => true,
);
register_taxonomy('wp_puzzle_project_type', array('wp_puzzle_projects'), $args);
}
add_action('init', 'wp_puzzle_register_taxonomy_project_type');Теперь в админке появится удобный фильтр и возможность назначать проекты к определённым типам.
Использование плагинов для упрощения создания CPT
Если вы не хотите писать код, можно использовать популярные плагины для создания и управления Custom Post Types:
- Custom Post Type UI — самый известный и простой плагин для регистрации CPT и таксономий через визуальный интерфейс.
- Pods — мощный инструмент для создания CPT, таксономий и метаполей с возможностью расширенного управления.
- Toolset Types — платный плагин для создания кастомных типов записей и полей с интеграцией в визуальные редакторы.
Использование плагинов удобно, когда нужно быстро настроить типы записей без программирования. Однако при сложной логике и кастомизации лучше всё же использовать код, чтобы избежать лишних нагрузок и ограничений.
Вывод записей собственного Post Type на фронтенде
Созданный CPT нужно правильно вывести на сайте. Для этого можно использовать WP_Query с параметром post_type. Пример вывода списка проектов:
<?php
$args = array(
'post_type' => 'wp_puzzle_projects',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
echo '<ul>';
while ($query->have_posts()) : $query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
endwhile;
echo '</ul>';
wp_reset_postdata();
else :
echo '<p>Проекты не найдены.</p>';
endif;
?>Такой код можно вставить в шаблон темы, страницу через шаблон или использовать в кастомном плагине.
Создание шаблонов для Custom Post Type
Чтобы настроить отображение CPT на сайте, создайте в теме файлы шаблонов:
single-wp_puzzle_projects.php— шаблон для одиночного проекта;archive-wp_puzzle_projects.php— шаблон для архива проектов.
Это позволит полностью контролировать вывод и оформление записей.
Добавление метаполей для расширения функционала CPT
Для хранения дополнительной информации (например, дата начала проекта, бюджет) можно добавить метаполя. Самый простой способ — использовать плагин Advanced Custom Fields (ACF), который позволяет создавать поля через админку и удобно выводить их в шаблонах.
Если хотите сделать это вручную, пример добавления метаполя в редактор записи:
function wp_puzzle_add_custom_meta_box() {
add_meta_box(
'wp_puzzle_project_details',
'Детали проекта',
'wp_puzzle_render_meta_box',
'wp_puzzle_projects',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wp_puzzle_add_custom_meta_box');
function wp_puzzle_render_meta_box($post) {
$start_date = get_post_meta($post->ID, '_wp_puzzle_start_date', true);
echo '<label for="wp_puzzle_start_date">Дата начала проекта:</label>';
echo '<input type="date" id="wp_puzzle_start_date" name="wp_puzzle_start_date" value="' . esc_attr($start_date) . '" />';
}
function wp_puzzle_save_meta_box_data($post_id) {
if (array_key_exists('wp_puzzle_start_date', $_POST)) {
update_post_meta($post_id, '_wp_puzzle_start_date', sanitize_text_field($_POST['wp_puzzle_start_date']));
}
}
add_action('save_post', 'wp_puzzle_save_meta_box_data');Теперь при создании проекта можно указать дату начала, а в шаблонах вывести это поле функцией get_post_meta().
Советы по SEO для Custom Post Types
Чтобы CPT хорошо индексировались и не создавали проблем с SEO, стоит соблюсти несколько правил:
- Обязательно задавайте правильные ЧПУ через параметр
rewriteпри регистрации CPT. - Используйте плагин SEO (Yoast SEO, Rank Math), который поддерживает CPT и позволяет настраивать метаданные.
- Создавайте шаблоны архивов и одиночных страниц с корректным выводом заголовков и описаний.
- Избегайте дублирования контента между CPT и обычными постами.
Заключение
Создание и использование собственных типов записей в WordPress — мощный инструмент для расширения функционала сайта. С их помощью можно структурировать контент, улучшить админку и сделать сайт удобнее для пользователей. В статье мы рассмотрели, как зарегистрировать CPT вручную, добавить таксономии, вывести записи на фронтенде и расширить их метаполями. Также упомянули полезные плагины, которые облегчают работу.
Если вы хотите погрузиться глубже, рекомендую экспериментировать с кодом и изучать официальную документацию WordPress по Custom Post Types и таксономиям.