В WordPress по умолчанию есть несколько типов контента: записи, страницы, медиафайлы и т.д. Но часто для удобства и структурирования данных требуется добавить собственные типы постов (Custom Post Types, CPT). Это позволяет создавать отдельные разделы сайта с уникальной логикой и отображением.
Что такое собственный тип поста в WordPress и зачем он нужен
Собственный тип поста — это дополнительный вид контента, который можно создавать и редактировать в админке WordPress, как обычные записи, но с другой логикой и структурой. Например, если у вас сайт с фильмами, можно завести CPT «Фильмы», где будут свои поля и шаблоны.
Это удобно, чтобы не смешивать разные данные в одной записи и не нагружать стандартные категории и метки. CPT помогают организовать сайт более логично и расширить функциональность без создания отдельного сайта или сложных таблиц в БД.
Для создания CPT чаще всего используется функция register_post_type(). Рассмотрим детально, как с ней работать.
Как зарегистрировать собственный тип поста — подробный пример с описанием параметров
Чтобы добавить CPT, нужно прописать функцию регистрации и подключить её к хуку init. Вот простой пример для CPT «Проекты»:
function wpreg_register_projects_cpt() {
$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'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
);
register_post_type('wpreg_project', $args);
}
add_action('init', 'wpreg_register_projects_cpt');Здесь мы задаём метки для интерфейса, делаем тип публичным, разрешаем архив, настраиваем URL через rewrite, включаем поддержку заголовка, редактора, миниатюр и анонсов, а также поддержку REST API для работы с Gutenberg и внешними приложениями.
Обратите внимание, что в названии типа поста wpreg_project мы добавили префикс wpreg_ — хорошая практика для избежания конфликтов с другими плагинами и темами.
Расширение функционала: добавление таксономий и метаполей для CPT
Чтобы CPT был максимально удобен, часто добавляют собственные таксономии (категории, теги) и метаполя (дополнительные данные).
Добавление таксономии
Например, создадим таксономию «Тип проекта» для нашего CPT «Проекты»:
function wpreg_register_project_taxonomy() {
$labels = array(
'name' => 'Типы проектов',
'singular_name' => 'Тип проекта',
'search_items' => 'Искать типы проектов',
'all_items' => 'Все типы проектов',
'edit_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('wpreg_project_type', array('wpreg_project'), $args);
}
add_action('init', 'wpreg_register_project_taxonomy');Таксономия «Тип проекта» позволит удобно фильтровать и группировать проекты в админке и на сайте.
Добавление метаполей через ACF и кодом
Для метаполей можно использовать плагин Clearfy Pro или Advanced Custom Fields. Но допустим, мы сделаем простое поле даты начала проекта кодом.
function wpreg_add_custom_meta_box() {
add_meta_box(
'wpreg_project_start',
'Дата начала проекта',
'wpreg_project_start_callback',
'wpreg_project',
'side'
);
}
add_action('add_meta_boxes', 'wpreg_add_custom_meta_box');
function wpreg_project_start_callback($post) {
wp_nonce_field('wpreg_save_project_start', 'wpreg_project_start_nonce');
$value = get_post_meta($post->ID, '_wpreg_project_start', true);
echo '<label for="wpreg_project_start_field">Дата начала:</label> ';
echo '<input type="date" id="wpreg_project_start_field" name="wpreg_project_start_field" value="'.esc_attr($value).'" />';
}
function wpreg_save_project_start_meta($post_id) {
if (!isset($_POST['wpreg_project_start_nonce'])) return;
if (!wp_verify_nonce($_POST['wpreg_project_start_nonce'], 'wpreg_save_project_start')) return;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wpreg_project_start_field'])) {
update_post_meta($post_id, '_wpreg_project_start', sanitize_text_field($_POST['wpreg_project_start_field']));
}
}
add_action('save_post', 'wpreg_save_project_start_meta');Этот код добавляет метабокс с полем даты в редакторе проекта и сохраняет значение в мета данных.
Отображение собственных типов постов на сайте — шаблоны и запросы
Для вывода CPT в теме создайте файл archive-wpreg_project.php для архива и single-wpreg_project.php для единичного поста. В них можно использовать обычные циклы WordPress.
Пример простого цикла для архива:
<?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; ?>Для выборки проектов с фильтрацией по таксономиям используйте WP_Query:
$args = array(
'post_type' => 'wpreg_project',
'tax_query' => array(
array(
'taxonomy' => 'wpreg_project_type',
'field' => 'slug',
'terms' => 'web',
),
),
);
$query = new WP_Query($args);Так вы получите проекты только с типом «web».
Полезные плагины для работы с собственными типами постов
Хотя CPT легко создать вручную, есть плагины, которые облегчают работу и настройку:
- Custom Post Type UI — удобный интерфейс для создания CPT и таксономий без кода.
- Advanced Custom Fields — добавляет мощные метаполя, которые можно привязать к CPT.
- Clearfy Pro — набор инструментов для оптимизации и создания удобных настроек, в том числе для CPT.
Используйте эти инструменты, если не хотите писать код вручную или хотите расширенный функционал.
Советы и лучшие практики при работе с собственными типами постов
Работая с CPT, учитывайте следующие моменты:
- Используйте уникальные префиксы в названиях функций и CPT, чтобы избежать конфликтов, например,
wpreg_. - Добавляйте поддержку REST API (
show_in_rest => true), чтобы использовать Gutenberg и внешние приложения. - Создавайте отдельные шаблоны для CPT в теме, чтобы полностью контролировать вывод контента.
- Если планируете много метаданных, используйте проверенные плагины для удобного редактирования.
- Не забывайте про безопасность — проверяйте nonce и права пользователя при сохранении метаданных.
Правильная организация CPT позволит сделать сайт структурированным, удобным для администрирования и расширяемым для новых задач.