В WordPress по умолчанию есть несколько типов записей, таких как записи (posts) и страницы (pages). Однако часто возникает необходимость создать свои собственные типы записей — custom post types, чтобы эффективно структурировать контент и расширять функциональность сайта. В этой статье мы подробно разберём, как добавить собственный тип записи в WordPress программно и при помощи плагинов, а также рассмотрим примеры полезных сценариев использования.
Что такое custom post type и зачем он нужен
Custom post type (CPT) — это пользовательский тип записи, который позволяет создавать и хранить контент, отличающийся по структуре и назначению от стандартных записей и страниц. Например, если вы ведёте сайт с каталогом книг, то логично создать CPT «Книги», чтобы удобно управлять этим контентом, иметь отдельные метабоксы, таксономии и шаблоны вывода.
Использование собственных типов записей позволяет:
- Организовать контент по тематике и типу;
- Создавать отдельные интерфейсы для редактирования;
- Настраивать отображение и фильтрацию данных;
- Расширять функционал без необходимости создания отдельных таблиц в базе данных.
Это значительно упрощает администрирование и улучшает пользовательский опыт.
Регистрация custom post type через функцию register_post_type
Самый распространённый способ добавить CPT — использовать функцию register_post_type(). Это нужно делать в файле functions.php вашей темы или в отдельном плагине.
Пример создания CPT «Книги» для сайта:
function wpbest_register_custom_post_type_books() {
$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' => 'books'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments')
);
register_post_type('wpbest_books', $args);
}
add_action('init', 'wpbest_register_custom_post_type_books');В этом коде мы создаём CPT с множеством параметров, которые определяют, как он будет отображаться в админке и на сайте. Обратите внимание, что префикс wpbest_ помогает избежать конфликтов с другими типами записей.
Разбор параметров в register_post_type
labels — массив с локализованными названиями для интерфейса.
public — делает тип записи доступным для фронтенда и админки.
rewrite — настраивает ЧПУ (человеко-понятные URL).
supports — перечисляет возможности, которые доступны для записей CPT (заголовок, редактор, миниатюры и т.д.).
Правильная настройка этих параметров позволяет максимально адаптировать тип записи под задачи сайта.
Добавление пользовательских таксономий для custom post type
Для организации записей CPT часто требуется добавить собственные таксономии — категории и метки. WordPress позволяет регистрировать пользовательские таксономии через функцию register_taxonomy().
Пример регистрации таксономии «Жанры» для CPT «Книги»:
function wpbest_register_taxonomy_genres() {
$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' => 'genres'),
);
register_taxonomy('wpbest_genres', array('wpbest_books'), $args);
}
add_action('init', 'wpbest_register_taxonomy_genres');Таксономия «Жанры» будет работать как обычные категории, позволяя создавать иерархии и фильтровать записи по жанрам.
Плагины для работы с custom post types
Если вы предпочитаете не писать код, то существуют мощные плагины для создания и управления CPT:
- Custom Post Type UI — позволяет создавать типы записей и таксономии через удобный интерфейс без кода.
- Pods — расширенный инструмент для создания CPT, таксономий и пользовательских полей.
- Toolset Types — комплексный плагин для построения сложной структуры контента.
Эти плагины отлично подходят для тех, кто не хочет вникать в детали кода, но при этом желает гибко настраивать структуру сайта.
Пример вывода записей собственного типа в шаблоне
Чтобы вывести записи CPT на сайте, можно использовать WP_Query с указанием типа записи:
$args = array(
'post_type' => 'wpbest_books',
'posts_per_page' => 10
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
the_excerpt();
}
wp_reset_postdata();
} else {
echo 'Книги не найдены';
}Этот код можно вставить в любой шаблон темы, чтобы вывести список книг. При необходимости можно добавить пагинацию, фильтры по таксономиям и другие элементы.
Советы и лучшие практики при работе с custom post types
При создании CPT стоит придерживаться нескольких правил:
- Используйте уникальные префиксы в названии типа записи и таксономий, чтобы избежать конфликтов с другими плагинами и темами.
- Регистрация CPT и таксономий должна происходить на хуке
init. - Следите за поддержкой локализации — используйте функции перевода, если планируете многоязычный сайт.
- Настраивайте permalinks (ЧПУ) и не забывайте сбрасывать их после изменений (через Settings > Permalinks или программно).
- Продумывайте структуру поддержки в шаблонах — шаблоны single-{post_type}.php и archive-{post_type}.php позволяют создавать кастомные страницы для CPT.
Правильная работа с custom post types значительно расширяет возможности WordPress и позволяет создавать сайты любой сложности.