WordPress изначально задуман как платформа для блогов, но благодаря системе пользовательских типов записей (Custom Post Types, CPT) можно создавать полноценные сайты с уникальной структурой контента. В этой статье расскажу, как создавать и настраивать персонализированные типы записей, чтобы расширить функциональность вашего сайта.
Что такое персонализированные типы записей в WordPress и зачем они нужны
Стандартно WordPress предлагает несколько типов записей: post (записи блога), page (страницы), и некоторые другие, например, вложения (attachments). Но часто нужно структурировать контент иначе — например, создать каталог товаров, портфолио, отзывы или события. Для этого используются пользовательские типы записей.
Пользовательские типы позволяют:
- Создавать отдельные разделы сайта с собственной логикой;
- Добавлять уникальные метаданные и таксономии именно для этого типа;
- Управлять отображением и поведением записи через шаблоны;
- Упростить работу редакторов, отделив разные виды контента.
Создание CPT — один из краеугольных камней разработки сложных сайтов на WordPress.
Регистрация пользовательского типа записи через functions.php
Самый распространённый способ — добавить код в файл functions.php вашей темы или в отдельный плагин. Рассмотрим пример создания CPT для портфолио.
function wptem_register_portfolio_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' => 'portfolio'),
'show_in_rest' => true, // поддержка Gutenberg
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
);
register_post_type('wptem_portfolio', $args);
}
add_action('init', 'wptem_register_portfolio_cpt');В этом коде мы задаём метки и параметры CPT. Обратите внимание на префикс wptem_ для названия типа записи и функции — это хорошая практика для избежания конфликтов.
Пояснения к параметрам
public— делает тип записи доступным для отображения и редактирования;has_archive— включает архивную страницу с перечнем всех записей типа;rewrite— настраивает ЧПУ, в нашем случае/portfolio/;show_in_rest— поддержка редактора Gutenberg и REST API;supports— список поддерживаемых функций редактора;menu_icon— иконка в админ-панели.
Добавление пользовательских таксономий для CPT
Часто нужно не только создать тип записи, но и организовать для него категории и метки. Для этого регистрируем пользовательские таксономии. Например, для портфолио — категории проектов и теги технологий.
function wptem_register_portfolio_taxonomies() {
// Категории портфолио
$labels_cat = array(
'name' => 'Категории портфолио',
'singular_name' => 'Категория портфолио',
'search_items' => 'Искать категории',
'all_items' => 'Все категории',
'edit_item' => 'Редактировать категорию',
'update_item' => 'Обновить категорию',
'add_new_item' => 'Добавить новую категорию',
'new_item_name' => 'Название новой категории',
'menu_name' => 'Категории портфолио',
);
$args_cat = array(
'hierarchical' => true, // как категории
'labels' => $labels_cat,
'show_ui' => true,
'show_in_rest' => true,
'rewrite' => array('slug' => 'portfolio-category'),
);
register_taxonomy('wptem_portfolio_category', array('wptem_portfolio'), $args_cat);
// Теги портфолио
$labels_tag = array(
'name' => 'Теги портфолио',
'singular_name' => 'Тег портфолио',
'search_items' => 'Искать теги',
'all_items' => 'Все теги',
'edit_item' => 'Редактировать тег',
'update_item' => 'Обновить тег',
'add_new_item' => 'Добавить новый тег',
'new_item_name' => 'Название нового тега',
'menu_name' => 'Теги портфолио',
);
$args_tag = array(
'hierarchical' => false, // как метки
'labels' => $labels_tag,
'show_ui' => true,
'show_in_rest' => true,
'rewrite' => array('slug' => 'portfolio-tag'),
);
register_taxonomy('wptem_portfolio_tag', array('wptem_portfolio'), $args_tag);
}
add_action('init', 'wptem_register_portfolio_taxonomies');Так вы получаете удобную структуру для фильтрации и сортировки записей в админке и на сайте.
Использование плагинов для создания CPT
Если не хотите писать код, можно использовать плагины, которые упрощают процесс:
- Custom Post Type UI — бесплатный плагин с удобным интерфейсом для создания CPT и таксономий;
- Pods — мощный инструмент для создания CPT, таксономий и кастомных полей;
- Toolset Types — платный плагин с расширенными возможностями для построения сложных структур.
Плагины хороши для быстрой настройки, но всегда полезно знать, как работать с кодом, чтобы гибко решать нестандартные задачи.
Вывод записей пользовательского типа на сайте — шаблоны и циклы
После регистрации CPT нужно вывести их на фронтенде. WordPress автоматически ищет шаблоны в теме по названию типа записи:
single-wptem_portfolio.php— для одиночной записи;archive-wptem_portfolio.php— для архива типа записи.
Если таких файлов нет, он будет использовать single.php и archive.php.
Пример простого цикла вывода записей портфолио в архиве:
if (have_posts()) {
while (have_posts()) {
the_post();
echo '<h2>' . get_the_title() . '</h2>';
the_excerpt();
if (has_post_thumbnail()) {
the_post_thumbnail('medium');
}
echo '<a href="' . get_permalink() . '">Подробнее</a>';
}
} else {
echo '<p>Работы не найдены.</p>';
}Кастомный WP_Query для выборки CPT
Для вывода CPT в любом месте сайта можно использовать WP_Query:
$args = array(
'post_type' => 'wptem_portfolio',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h3>' . get_the_title() . '</h3>';
the_excerpt();
}
wp_reset_postdata();
} else {
echo '<p>Портфолио пусто.</p>';
}Резюме и советы для разработки CPT
Создание персонализированных типов записей — мощный инструмент для построения любого сайта на WordPress. Главное — придерживаться следующих рекомендаций:
- Используйте префиксы для функций и названий CPT, чтобы избежать конфликтов.
- Регистрируйте CPT и таксономии в хуке
init. - Не забывайте про поддержку REST API, если используете Gutenberg или планируете интеграции.
- Создавайте отдельные шаблоны для CPT, чтобы легко контролировать вывод.
- Используйте кастомные поля и метаданные для расширения функционала.
Таким образом вы получите структурированный, удобный и расширяемый сайт, который будет понятен и пользователям, и редакторам.