В WordPress по умолчанию существуют стандартные типы записей — записи (posts) и страницы (pages). Но часто в проектах требуется добавить собственный тип записей, чтобы структурировать контент более гибко: например, товары, портфолио, отзывы, события и так далее. В этой статье разберём, как создать собственный тип записей (Custom Post Type, CPT) с помощью кода и какие нюансы нужно учитывать.
Что такое Custom Post Type и зачем он нужен
Custom Post Type — это тип записи, который создаётся разработчиком для хранения специфического контента. Например, если у вас сайт агентства, вы можете создать CPT «Проекты» для публикации кейсов. Это позволяет разделять разные виды информации и управлять ими независимо.
Стандартные типы записей не всегда подходят для всех задач, и CPT помогает улучшить организацию и UX в админке, а также на фронтенде сайта.
Регистрация собственного типа записей в WordPress
Для регистрации CPT используется функция register_post_type(). Лучше всего добавлять этот код в файл темы functions.php или в отдельный плагин. Вот базовый пример регистрации CPT «Проекты» на wpstart.ru:
function wpstart_register_projects_cpt() {
$labels = array(
'name' => 'Проекты',
'singular_name' => 'Проект',
'add_new' => 'Добавить проект',
'add_new_item' => 'Добавить новый проект',
'edit_item' => 'Редактировать проект',
'new_item' => 'Новый проект',
'view_item' => 'Просмотреть проект',
'search_items' => 'Поиск проектов',
'not_found' => 'Проекты не найдены',
'not_found_in_trash' => 'В корзине проекты не найдены',
'menu_name' => 'Проекты'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'projects'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'show_in_rest' => true, // поддержка Gutenberg
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio'
);
register_post_type('wpstart_project', $args);
}
add_action('init', 'wpstart_register_projects_cpt');
Этот код создаст новый тип записей с названием «Проекты», который будет отображаться в админке с иконкой портфолио.
Объяснение параметров
'public' => true— запись видна и на фронтенде, и в админке.'has_archive' => true— создаёт архивную страницу по адресу/projects/.'supports'— какие стандартные возможности доступны (заголовок, редактор, миниатюры и т.д.).'show_in_rest' => true— добавляет поддержку редактора Gutenberg и REST API.'menu_icon'— иконка в меню админки.
Добавление мета-полей с помощью плагина Advanced Custom Fields
Для расширения CPT полезно добавить мета-поля — например, дату начала проекта, ссылку на сайт, статус. Самый удобный способ — плагин Advanced Custom Fields (ACF).
После установки ACF создайте группу полей и свяжите её с типом записи wpstart_project. Например, добавим поля:
- Дата начала (тип Date Picker)
- Ссылка на проект (тип URL)
- Статус (тип Select: В разработке, Завершён)
На фронтенде вывести эти поля просто, используя функцию get_field():
function wpstart_display_project_meta() {
$start_date = get_field('start_date');
$project_url = get_field('project_url');
$status = get_field('status');
if ($start_date) {
echo '<p><strong>Дата начала:</strong> ' . esc_html($start_date) . '</p>';
}
if ($project_url) {
echo '<p><strong>Ссылка:</strong> <a href="' . esc_url($project_url) . '" target="_blank" rel="noopener">' . esc_html($project_url) . '</a></p>';
}
if ($status) {
echo '<p><strong>Статус:</strong> ' . esc_html($status) . '</p>';
}
}
Вызовите эту функцию в шаблоне single-wpstart_project.php, чтобы вывести информацию о проекте.
Создание шаблонов для собственного типа записей
WordPress использует иерархию шаблонов для отображения CPT. Для нового типа записей wpstart_project можно создать файлы:
single-wpstart_project.php— для отдельной записи проектаarchive-wpstart_project.php— для страницы архива проектов
В этих файлах можно настраивать вывод так, как нужно. Например, в archive-wpstart_project.php можно реализовать вывод проектов с пагинацией и фильтрацией, а в single-wpstart_project.php — полное описание проекта с мета-полями.
Пример кода для архива с пагинацией
if (have_posts()) :
while (have_posts()) : the_post();
?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div><?php the_excerpt(); ?></div>
<?php
endwhile;
the_posts_pagination(array(
'prev_text' => 'Назад',
'next_text' => 'Вперед',
));
else :
echo '<p>Проекты не найдены.</p>';
endif;
Добавление таксономий для собственного типа записей
Для классификации CPT полезно создать пользовательские таксономии — категории или теги. Например, для проектов можно добавить таксономию «Тип проекта».
Регистрация таксономии происходит с помощью register_taxonomy(). Пример:
function wpstart_register_project_taxonomy() {
$labels = array(
'name' => 'Типы проектов',
'singular_name' => 'Тип проекта',
'search_items' => 'Поиск типов',
'all_items' => 'Все типы',
'edit_item' => 'Редактировать тип',
'add_new_item' => 'Добавить новый тип',
'menu_name' => 'Типы проектов'
);
$args = array(
'hierarchical' => true, // как категории
'labels' => $labels,
'show_ui' => true,
'show_in_rest' => true,
'rewrite' => array('slug' => 'project-type'),
);
register_taxonomy('wpstart_project_type', array('wpstart_project'), $args);
}
add_action('init', 'wpstart_register_project_taxonomy');
Теперь в админке можно создавать типы проектов и присваивать их записям.
Полезные плагины для работы с Custom Post Types
- Advanced Custom Fields — для создания мета-полей и удобного управления ими.
- Custom Post Type UI — интерфейс для регистрации CPT и таксономий без кода.
- Code Snippets — для добавления кастомного кода безопасно и удобно.