Кастомные типы постов (Custom Post Types, CPT) — один из самых мощных инструментов WordPress, позволяющий расширить стандартный функционал сайта и создавать уникальные структуры контента. В этой статье подробно разберём, как правильно добавлять кастомные типы постов, регистрировать их через код, настраивать отображение и использовать на практике для решения конкретных задач.
Что такое кастомные типы постов и зачем они нужны
Стандартные типы постов в WordPress — это post и page. Однако зачастую для проектов нужно больше гибкости: например, создать раздел с отзывами, портфолио, мероприятиями или товарами, которые отличаются по структуре и логике отображения.
Кастомные типы постов дают возможность выделить такие данные отдельно, что упрощает управление и позволяет создавать отдельные шаблоны для вывода. Это особенно полезно при разработке сайтов с нестандартной архитектурой контента.
Примером может служить сайт агентства, где помимо страниц и записей есть отдельный тип поста «Проекты» с уникальными метаполями и таксономиями.
Регистрация кастомного типа поста через functions.php
Самый распространённый способ — добавить код регистрации CPT в файл functions.php вашей темы или в отдельный плагин. Ниже приведён пример функции wparticles_register_custom_post_type, которая регистрирует кастомный тип поста «Проекты».
function wparticles_register_custom_post_type() {
$labels = array(
'name' => 'Проекты',
'singular_name' => 'Проект',
'menu_name' => 'Проекты',
'name_admin_bar' => 'Проект',
'add_new' => 'Добавить новый',
'add_new_item' => 'Добавить новый проект',
'new_item' => 'Новый проект',
'edit_item' => 'Редактировать проект',
'view_item' => 'Просмотреть проект',
'all_items' => 'Все проекты',
'search_items' => 'Поиск проектов',
'parent_item_colon' => 'Родительский проект:',
'not_found' => 'Проекты не найдены.',
'not_found_in_trash' => 'Проекты не найдены в корзине.',
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'projects'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'show_in_rest' => true, // Включаем поддержку REST API
);
register_post_type('wparticles_project', $args);
}
add_action('init', 'wparticles_register_custom_post_type');Обратите внимание на ключевые параметры:
public— делает тип поста доступным для фронтенда;has_archive— включает архивную страницу для типа поста;supports— указывает, какие стандартные метабоксы включать (заголовок, редактор, миниатюры и др.);rewrite— задаёт ЧПУ для типа поста;show_in_rest— если нужно работать с Gutenberg и REST API.
Настройка таксономий для кастомных типов постов
Чтобы классифицировать записи кастомного типа, часто добавляют собственные таксономии — категории и метки, которые не пересекаются со стандартными. Это улучшает организацию контента и фильтрацию.
Пример добавления таксономии «Тип проекта» для CPT «Проекты»:
function wparticles_register_project_taxonomy() {
$labels = array(
'name' => 'Типы проектов',
'singular_name' => 'Тип проекта',
'search_items' => 'Поиск типов проектов',
'all_items' => 'Все типы проектов',
'parent_item' => 'Родительский тип',
'parent_item_colon' => 'Родительский тип:',
'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('wparticles_project_type', array('wparticles_project'), $args);
}
add_action('init', 'wparticles_register_project_taxonomy');Иерархическая таксономия похожа на категории, а неиерархическая — на метки. Выбирайте в зависимости от потребностей.
Вывод кастомных типов постов в шаблонах
Для отображения кастомных типов постов на сайте нужно создать отдельные шаблоны. WordPress автоматически ищет файлы по шаблону:
single-{post_type}.php— для одиночной записи;archive-{post_type}.php— для архивной страницы.
Если их нет, используется single.php и archive.php.
Пример простого вывода списка проектов в archive-wparticles_project.php:
<?php get_header(); ?>
<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; ?>
<?php get_footer(); ?>Для более сложного вывода можно использовать WP_Query с параметром post_type:
$args = array(
'post_type' => 'wparticles_project',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// выводим контент
}
wp_reset_postdata();
}Плагины для удобного создания кастомных типов постов
Если вы не хотите писать код вручную, воспользуйтесь плагинами, которые создают CPT и таксономии через интерфейс:
- Custom Post Type UI — самый популярный и простой в использовании плагин. Позволяет быстро регистрировать CPT и таксономии без кода.
- Pods — расширенный плагин для создания кастомных типов, таксономий и метаполей с возможностью настройки шаблонов.
- Toolset Types — мощный комплексный инструмент для создания сложной структуры контента и связей между данными.
Использование таких плагинов экономит время и снижает вероятность ошибок, особенно для новичков.
Рекомендации по работе с кастомными типами постов
Несколько советов, которые помогут избежать проблем при работе с CPT:
- Всегда используйте уникальные префиксы в названиях типов и таксономий, чтобы избежать конфликтов с другими плагинами и темами. В нашем случае — префикс
wparticles_. - Подключайте поддержку REST API (
show_in_rest = true), если планируете использовать Gutenberg или внешние приложения. - Создавайте отдельные шаблоны для CPT, чтобы контролировать внешний вид и логику вывода.
- При изменении параметров CPT не забывайте сбрасывать правила перезаписи URL, зайдя в настройки > постоянные ссылки и нажав «Сохранить». Иначе могут возникнуть 404 ошибки.
- Для добавления метаполей используйте Advanced Custom Fields (ACF) или создавайте собственные метабоксы с помощью хуков WordPress.
Пример добавления метабокса для кастомного поля
Для расширения функционала CPT можно добавить собственные поля через метабоксы. Пример функции для добавления поля «Клиент проекта» в редактор:
function wparticles_add_custom_meta_box() {
add_meta_box(
'wparticles_client_meta',
'Клиент проекта',
'wparticles_client_meta_box_callback',
'wparticles_project',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wparticles_add_custom_meta_box');
function wparticles_client_meta_box_callback($post) {
wp_nonce_field('wparticles_save_client_meta', 'wparticles_client_meta_nonce');
$value = get_post_meta($post->ID, '_wparticles_client', true);
echo '<label for="wparticles_client_field">Имя клиента:</label>';
echo '<input type="text" id="wparticles_client_field" name="wparticles_client_field" value="' . esc_attr($value) . '" size="25" />';
}
function wparticles_save_client_meta($post_id) {
if (!isset($_POST['wparticles_client_meta_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wparticles_client_meta_nonce'], 'wparticles_save_client_meta')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wparticles_client_field'])) {
update_post_meta($post_id, '_wparticles_client', sanitize_text_field($_POST['wparticles_client_field']));
}
}
add_action('save_post', 'wparticles_save_client_meta');Такое поле появится в редакторе проекта и будет сохраняться в метаданных.
Итог
Кастомные типы постов — незаменимый инструмент для разработки на WordPress, позволяющий создавать сайты с уникальной структурой и удобным управлением контентом. Правильная регистрация, настройка таксономий, создание шаблонов и добавление метаполей сделают ваш проект гибким и масштабируемым.
Используйте приведённые примеры кода и рекомендации, чтобы быстро и без ошибок внедрить CPT на свой сайт.