Custom Post Type (CPT) — это мощный инструмент WordPress, позволяющий расширять стандартные возможности CMS и создавать уникальные типы контента, отличные от обычных записей и страниц. В этой статье мы подробно разберем, как правильно создать и зарегистрировать собственный Custom Post Type для вашего сайта, используя как код, так и популярные плагины.
Что такое Custom Post Type и зачем он нужен
WordPress по умолчанию поддерживает несколько типов контента: записи (posts), страницы (pages), вложения (attachments) и т.д. Однако в сложных проектах часто требуется отдельный тип контента — например, для портфолио, продуктов, отзывов или событий. Именно для этого существуют Custom Post Types.
Используя CPT, вы можете структурировать контент, улучшить удобство администрирования и вывести новые возможности для пользователей и посетителей сайта. К тому же, Custom Post Types полностью интегрируются с темами и плагинами, поддерживая таксономии, метаполя и шаблоны отображения.
Регистрация Custom Post Type через functions.php
Самый надежный и гибкий способ создать CPT — добавить код в файл functions.php вашей темы или в отдельный плагин. Ниже пример кода, который создает тип записи «Проекты».
function wpmentor_register_custom_post_type_projects() {
$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' => 'Искать проекты',
'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,
'menu_icon' => 'dashicons-portfolio',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
);
register_post_type('wpmentor_projects', $args);
}
add_action('init', 'wpmentor_register_custom_post_type_projects');Обратите внимание, что функция названа с префиксом wpmentor_ для избежания конфликтов. В параметре 'supports' перечислены возможности, которые будут доступны для этого типа записей — заголовок, редактор, миниатюры и т. д.
Объяснение параметров register_post_type
labels — массив с названиями и текстами интерфейса в админке.
public — разрешает использование CPT на фронтенде.
rewrite — задает ЧПУ для типа записей.
has_archive — включает архивную страницу для всех записей данного типа.
supports — определяет доступные метабоксы и функции для записи.
Использование плагинов для создания Custom Post Type
Если вы не хотите писать код вручную, можно использовать плагины для создания CPT. Вот несколько популярных и надежных решений:
- Custom Post Type UI — один из самых популярных плагинов с удобным графическим интерфейсом для создания и управления CPT и таксономиями.
- Pods — позволяет создавать не только CPT, но и настраиваемые поля, отношения между типами записей и расширенные метаданные.
- Toolset Types — мощный плагин с поддержкой сложных проектов, включая создание CPT и кастомных таксономий.
Преимущество плагинов — простота и скорость создания, однако для тонкой настройки и оптимизации лучше использовать код.
Добавление таксономий и метаполей к Custom Post Type
Часто для CPT нужны собственные категории и метаданные. Например, для «Проектов» можно добавить таксономию «Тип проекта» и кастомное поле «Дата начала».
Регистрация таксономии с помощью кода
function wpmentor_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'),
);
register_taxonomy('wpmentor_project_type', array('wpmentor_projects'), $args);
}
add_action('init', 'wpmentor_register_taxonomy_project_type');Добавление пользовательского поля (метаполя)
Для добавления кастомных полей можно использовать плагины, например Advanced Custom Fields (ACF), либо реализовать вручную:
function wpmentor_add_custom_meta_box() {
add_meta_box(
'wpmentor_project_date',
'Дата начала проекта',
'wpmentor_project_date_callback',
'wpmentor_projects',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpmentor_add_custom_meta_box');
function wpmentor_project_date_callback($post) {
$value = get_post_meta($post->ID, '_wpmentor_project_date', true);
echo '<label for="wpmentor_project_date_field">Дата начала:</label>';
echo '<input type="date" id="wpmentor_project_date_field" name="wpmentor_project_date_field" value="' . esc_attr($value) . '" />';
}
function wpmentor_save_project_date_meta($post_id) {
if (array_key_exists('wpmentor_project_date_field', $_POST)) {
update_post_meta(
$post_id,
'_wpmentor_project_date',
$_POST['wpmentor_project_date_field']
);
}
}
add_action('save_post', 'wpmentor_save_project_date_meta');Этот код создаст метабокс с полем даты и сохранит введенное значение в метаданные записи.
Вывод Custom Post Type на сайте и создание шаблонов
Чтобы отображать записи вашего CPT на сайте, можно создать шаблоны в теме. Для архива создайте файл archive-wpmentor_projects.php, а для одиночного просмотра — single-wpmentor_projects.php. В них можно настроить вывод так, как нужно.
Пример простого цикла для вывода проектов:
<?php
$args = array(
'post_type' => 'wpmentor_projects',
'posts_per_page' => 10,
);
$projects = new WP_Query($args);
if ($projects->have_posts()) :
while ($projects->have_posts()) : $projects->the_post(); ?>
<h2><?php the_title(); ?></h2>
<div><?php the_excerpt(); ?></div>
<?php endwhile;
wp_reset_postdata();
else :
echo '<p>Проекты не найдены.</p>';
endif;
?>Советы по оптимизации и безопасности Custom Post Type
При добавлении CPT следите за уникальностью слагов и названий функций, чтобы избежать конфликтов с другими плагинами и темами.
Рекомендуется использовать префиксы в названиях функций и метаданных. Также не забывайте про права доступа — если для вашего CPT нужен ограниченный доступ, настраивайте параметры capability_type и capabilities.
Для производительности избегайте избыточных запросов и используйте кэширование, если планируется вывод большого количества записей.
И, конечно, тестируйте изменения на локальной копии сайта перед выкладкой на продакшн.