В WordPress стандартно предусмотрены несколько типов записей, таких как записи (posts) и страницы (pages). Однако для многих проектов этого недостаточно, и возникает необходимость в создании собственных типов записей — Custom Post Types (CPT). В этой статье рассмотрим, как создать CPT с нуля, настроить его параметры и вывести записи нового типа на сайте. При этом будут приведены практические примеры кода и советы по использованию.
Что такое Custom Post Type и зачем он нужен
Custom Post Type — это пользовательский тип контента, который позволяет структурировать и организовывать информацию на сайте более гибко. Например, если вы создаёте сайт портфолио, можно завести CPT «Проекты», чтобы отделить их от обычных записей блога. Аналогично, для сайта с мероприятиями можно создать CPT «События».
Использование CPT помогает не смешивать разные типы данных, облегчает администрирование и позволяет создавать уникальные шаблоны вывода для каждого типа контента.
Важно понимать, что CPT — это не просто таксономия или метаполя, а полноценный тип записи, который можно регистрировать, редактировать и выводить.
Регистрация собственного типа записей в WordPress
Для создания CPT используется функция register_post_type(), которую необходимо вызывать в хук init. Хорошей практикой является оформление регистрации CPT в отдельной функции с префиксом домена, например, wpfactory_register_custom_post_type().
Рассмотрим базовый пример создания CPT «Проекты».
function wpfactory_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' => 'projects'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'comments')
);
register_post_type('project', $args);
}
add_action('init', 'wpfactory_register_custom_post_type');В этом примере мы создали CPT с названием project, который поддерживает заголовок, редактор, миниатюру, краткое описание и комментарии. Благодаря параметру has_archive для CPT автоматически создаётся архивная страница по адресу /projects/.
Объяснение параметров
- labels — массив с названиями для разных частей интерфейса администратора;
- public — отображать ли записи CPT публично на сайте;
- rewrite — правила преобразования URL, в нашем случае slug будет
projects; - supports — набор функционала, который будет доступен для CPT (заголовок, редактор, миниатюры и т.д.);
- has_archive — включение архивной страницы для CPT.
Добавление таксономий к кастомному типу записей
Для удобной фильтрации и группировки записей CPT часто используются таксономии. Можно применять стандартные (категории, метки) или создавать свои пользовательские таксономии.
Рассмотрим пример регистрации пользовательской таксономии «Тип проекта» для CPT «Проекты».
function wpfactory_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'),
);
register_taxonomy('project_type', array('project'), $args);
}
add_action('init', 'wpfactory_register_project_taxonomy');Теперь при создании или редактировании проекта вы сможете указывать тип проекта, что облегчит организацию и вывод записей.
Вывод записей собственного типа на сайте
Для вывода записей CPT в шаблонах WordPress можно использовать WP_Query с указанием параметра post_type.
Пример вывода последних 5 проектов:
$args = array(
'post_type' => 'project',
'posts_per_page' => 5,
);
$project_query = new WP_Query($args);
if ($project_query->have_posts()) {
echo '<ul>';
while ($project_query->have_posts()) {
$project_query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
} else {
echo 'Проекты не найдены.';
}
wp_reset_postdata();Такой код можно поместить в любой шаблон темы, например, в page-projects.php или в виджет.
Создание шаблонов для CPT
Для улучшения отображения CPT можно создать отдельные шаблоны:
single-project.php— шаблон для одиночной записи типа «Проект»;archive-project.php— шаблон для архивной страницы всех проектов.
Если таких шаблонов нет, WordPress будет использовать стандартные single.php и archive.php.
Советы и рекомендации по работе с Custom Post Types
При создании CPT важно:
- Выбирать уникальные имена (с префиксом, если необходимо) для CPT и таксономий, чтобы избежать конфликтов с плагинами и темами.
- Использовать правильные параметры, учитывая требования проекта, например, если нужно вести иерархию, ставьте
hierarchical => true. - Регистрация CPT должна происходить на хуке
init, чтобы они были доступны вовремя. - Не забывайте очищать правила перезаписи (перейдите в Настройки → Постоянные ссылки и нажмите «Сохранить»), чтобы новые URL работали корректно.
Расширение функционала CPT через плагины
Если вы не хотите писать код вручную, можно воспользоваться плагинами:
- Custom Post Type UI — удобный интерфейс для регистрации CPT и таксономий без кода;
- Advanced Custom Fields (ACF) — для добавления метаполей и расширенного управления полями CPT;
- Pods — комплексное решение для создания CPT, таксономий и пользовательских полей.
Однако знание базовой регистрации CPT через код даёт больше контроля и понимания, что происходит внутри.