В WordPress по умолчанию есть несколько видов контента: записи (Posts), страницы (Pages), вложения и т. д. Однако для многих проектов этого недостаточно. Например, если вы создаёте сайт с портфолио, каталогом товаров, событиями или отзывами, логично использовать отдельные типы записей — Custom Post Types (CPT). В этой статье подробно разберём, как создать собственный тип записи с нуля, какие параметры можно использовать и как работать с ним в теме и плагинах.
Что такое Custom Post Type и зачем он нужен в WordPress
Custom Post Type — это специальный тип контента, который вы можете добавить в админ-панель WordPress, помимо стандартных записей и страниц. CPT позволяет структурировать данные, разделить разные виды контента и упростить их управление.
Например, если у вас сайт с мероприятиями, лучше создать CPT «События», чтобы они имели свои поля, таксономии и отличались от блоговых записей. Это улучшит пользовательский опыт и упростит разработку.
Кроме того, многие популярные плагины, например, WooCommerce, используют собственные CPT для товаров и заказов.
Регистрация собственного типа записи в WordPress
Для создания собственного типа записи используется функция register_post_type(). Обычно её вызывают в хуке init. Рассмотрим пример регистрации CPT «Проекты».
Пример кода регистрации CPT
function wp_pro_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,
'menu_icon' => 'dashicons-portfolio',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields')
);
register_post_type('wp_pro_project', $args);
}
add_action('init', 'wp_pro_register_custom_post_type');
В этом примере тип записи называется wp_pro_project. Важно использовать префикс (здесь wp_pro_), чтобы избежать конфликтов с другими плагинами и темами.
Подробный разбор параметров register_post_type
Рассмотрим ключевые параметры массива $args:
- labels — массив названий для админки. Желательно заполнить все, чтобы интерфейс был понятным.
- public — делает CPT видимым на сайте и в админке.
- publicly_queryable — позволяет делать запросы с фронтенда (например, через URL).
- show_ui — отображать ли интерфейс в админке.
- show_in_menu — показывать ли в меню админки.
- query_var — включить возможность использовать запросы с параметром типа записи.
- rewrite — настройки ЧПУ (pretty permalinks). Здесь мы задаём свой слаг.
- capability_type — права доступа, обычно 'post' или 'page'.
- has_archive — включить ли архивную страницу с архивом всех записей CPT.
- hierarchical — позволяет ли создавать иерархию (как страницы с подстраницами). Обычно false для записей.
- menu_position — позиция в меню админки.
- menu_icon — иконка в меню, можно взять из Dashicons.
- supports — массив поддерживаемых стандартных возможностей: заголовок, редактор, миниатюры, произвольные поля и т. д.
Добавление пользовательских таксономий для CPT
Чтобы структурировать контент CPT, часто создают свои таксономии (категории, теги). Например, для проектов это может быть «Тип проекта» или «Заказчик».
Пример регистрации таксономии
function wp_pro_register_custom_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('wp_pro_project_type', array('wp_pro_project'), $args);
}
add_action('init', 'wp_pro_register_custom_taxonomy');
В этом примере создаётся иерархическая таксономия «Типы проектов», связанная с CPT «Проекты».
Вывод записей собственного типа на сайте
Чтобы вывести записи CPT на сайте, можно использовать стандартный класс WP_Query. Например, вывести последние 5 проектов:
$args = array(
'post_type' => 'wp_pro_project',
'posts_per_page' => 5,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo 'Проекты не найдены';
}
Такой код можно использовать в шаблонах темы, чтобы выводить нужный контент.
Кастомизация шаблонов для Custom Post Type
Для полноценной интеграции CPT в тему полезно создать шаблоны для отображения одной записи и архива. WordPress ищет файлы по шаблону:
single-{post_type}.php— шаблон отдельной записи CPT.archive-{post_type}.php— шаблон архива CPT.
Если таких файлов нет, WordPress использует стандартные single.php и archive.php.
Например, создайте файл single-wp_pro_project.php в вашей теме и оформите вывод так, как нужно для проектов. Это позволит вывести уникальный дизайн и дополнительные поля.
Добавление метаполей (custom fields) к CPT с помощью плагина Advanced Custom Fields (ACF)
Нередко стандартных полей мало, и нужно добавить собственные метаполя, например, дату начала проекта, ссылку на сайт заказчика, статус и т. д. Для этого удобно использовать плагин Advanced Custom Fields (ACF).
После установки плагина создайте группу полей и укажите, что она применяется к вашему типу записи «Проекты». В шаблоне вывести поле можно так:
echo esc_html(get_field('project_start_date'));
Это значительно расширит возможности кастомизации контента без написания большого количества кода.
Автоматизация создания CPT с помощью плагина Custom Post Type UI
Если вы не хотите писать код вручную, можно воспользоваться бесплатным плагином Custom Post Type UI. Он позволяет через удобный интерфейс создавать и настраивать типы записей и таксономии.
Однако для разработчика лучше уметь создавать типы записи программно — так код переносим, контролируем версионирование и лучше понимаем внутренние механизмы WordPress.
Советы по работе с Custom Post Types
- Используйте префиксы в названиях CPT и функций, чтобы избежать конфликтов с другими плагинами.
- Пишите читаемые и полные метки (labels) для удобства пользователей в админке.
- Обязательно регистрируйте CPT и таксономии в хуке
init. - Создавайте отдельные шаблоны для CPT, чтобы уникализировать внешний вид.
- Используйте ACF для расширения метаданных записи без сложного кода.
- Тестируйте ЧПУ (permalinks) после регистрации CPT, иногда надо сохранить настройки ссылок в админке.
- Для вывода записей CPT используйте
WP_Queryс параметромpost_type.
Пример функции wp_pro_get_recent_projects для вывода последних проектов
function wp_pro_get_recent_projects($count = 5) {
$args = array(
'post_type' => 'wp_pro_project',
'posts_per_page' => $count,
);
$query = new WP_Query($args);
$output = '<ul>';
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
wp_reset_postdata();
} else {
$output .= '<li>Проекты не найдены</li>';
}
$output .= '</ul>';
return $output;
}
Эту функцию можно вызвать в шаблоне темы или в шорткоде, чтобы вывести список проектов.