Если вы хотите вывести на своем сайте WordPress не просто записи блога, а, например, портфолио, отзывы, товары или мероприятия с уникальными полями и структурой, то создание собственного типа записи (Custom Post Type, CPT) — оптимальное решение. В этой статье подробно разберем, как создать собственный тип записи с помощью кода, а также рассмотрим полезные плагины для упрощения задачи.
Что такое собственный тип записи в WordPress
По умолчанию WordPress работает с несколькими типами записей: post (записи блога), page (страницы), attachment (медиафайлы) и несколько других. Однако часто стандартных типов недостаточно для удобного управления контентом. Собственные типы записи позволяют создавать новые категории контента с собственными параметрами, таксономиями и метаданными.
Например, для сайта агентства можно создать CPT «Проекты», а для сайта ресторана — CPT «Меню».
Это позволяет не смешивать разные виды контента и значительно улучшает структуру и удобство админки.
Регистрация собственного типа записи через функцию wpshab_register_custom_post_type
Для регистрации CPT в WordPress используется функция register_post_type(). Для удобства и соблюдения лучших практик обернем ее в функцию с префиксом wpshab, чтобы избежать конфликтов.
function wpshab_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' => 'project'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'comments'),
'show_in_rest' => true
);
register_post_type('wpshab_project', $args);
}
add_action('init', 'wpshab_register_custom_post_type');В этом примере регистрируется новый тип записи wpshab_project с названием «Проекты». Обратите внимание на параметры:
- labels — все тексты интерфейса, которые будут видны администратору.
- public — делает тип записи публичным, его можно вывести на сайте.
- rewrite — определяет, какой URL будет у записей типа:
/project/название-поста/. - supports — набор стандартных функций, доступных в записи (заголовок, редактор, миниатюра и т.д.).
- show_in_rest — активирует совместимость с Gutenberg и REST API.
Настройка таксономий для собственного типа записи
Часто CPT необходимо связать с собственными категориями или тегами. Для этого создадим собственную таксономию, например, «Типы проектов».
function wpshab_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('wpshab_project_type', array('wpshab_project'), $args);
}
add_action('init', 'wpshab_register_project_taxonomy');Теперь в админке при добавлении проекта можно будет указать его тип, что удобно для фильтрации и вывода.
Использование плагинов для создания CPT без кода
Если не хочется писать код, можно воспользоваться бесплатными плагинами, которые позволяют создавать собственные типы записи через интерфейс:
- Custom Post Type UI — самый популярный плагин для создания CPT и таксономий без кода.
- Pods — расширенный инструмент для создания CPT, таксономий и пользовательских полей.
- Toolset Types — мощный плагин с широкими возможностями, но с платной версией для продвинутых функций.
Обычно достаточно Custom Post Type UI для базовых задач. После создания CPT плагин генерирует код, который можно использовать для переноса на другой сайт.
Добавление пользовательских полей к CPT с помощью Advanced Custom Fields
Один из ключевых моментов при работе с CPT — расширение их метаинформацией. Для этого удобно использовать плагин Advanced Custom Fields (ACF). Он позволяет создавать поля различных типов (текст, дата, галерея, выбор из списка и др.) и привязывать их к CPT.
Пример вывода поля ACF в шаблоне single-wpshab_project.php:
<?php
$project_client = get_field('client_name');
if ($project_client) {
echo '<p><strong>Клиент:</strong> ' . esc_html($project_client) . '</p>';
}
?>Таким образом, можно гибко настраивать структуру данных для каждого типа записи.
Вывод записей собственного типа на сайте
Для вывода записей CPT можно создать специальный шаблон архива archive-wpshab_project.php и шаблон одиночной записи single-wpshab_project.php в вашей теме.
Пример базового цикла вывода записей типа «wpshab_project» в archive-wpshab_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(); ?>Подобным образом настраивается вывод одиночной записи с дополнительными полями.
Советы и лучшие практики
1. Всегда используйте уникальный префикс для функций и имен типов записи, чтобы избежать конфликтов с плагинами и темами.
2. Регистрация CPT и таксономий должна происходить на хуке init, чтобы WordPress корректно их обработал.
3. Обязательно добавляйте поддержку REST API через show_in_rest => true, чтобы обеспечить совместимость с редактором Gutenberg и внешними сервисами.
4. Для сложных структур данных используйте ACF или аналогичные плагины, чтобы расширить возможности без глубокого погружения в код.
5. Создавайте отдельные шаблоны для CPT, чтобы сохранить структуру и уникальность отображения данных.