Custom Post Types (CPT) — это мощный инструмент WordPress, позволяющий создавать свои типы записей, отличные от стандартных «Записей» и «Страниц». Использование CPT позволяет структурировать контент более гибко, что особенно полезно для сайтов с нестандартным контентом, например, портфолио, каталоги, отзывы и т.д.
Что такое Custom Post Types и зачем они нужны
WordPress изначально поддерживает два основных типа контента: записи (posts) и страницы (pages). Однако для создания более сложных проектов этого часто недостаточно. Например, если вы ведёте сайт с обзорами книг, удобно выделить книги в отдельный тип записей с собственными полями и таксономиями.
Custom Post Types позволяют:
- Логически отделить разные типы контента.
- Добавить уникальные настройки и мета-поля для каждого типа.
- Облегчить администрирование и навигацию по сайту.
- Улучшить SEO за счёт структурированного контента.
Без CPT многие сайты смешивают разные типы контента в обычных записях, что создаёт путаницу и усложняет управление.
Как создать Custom Post Type в WordPress: пример кода
Создать CPT можно с помощью функции register_post_type(). Лучшее место для этого — файл functions.php вашей темы или специальный плагин. Ниже пример создания CPT для «Книги» (books) на сайте WordPressa.
function wordpressa_register_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' => 'book'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
'show_in_rest' => true,
);
register_post_type('book', $args);
}
add_action('init', 'wordpressa_register_post_type_books');Данный код добавляет новый тип записей «Книги» с поддержкой стандартных функций: заголовок, редактор, миниатюра и т.д. Параметр 'show_in_rest' => true позволяет использовать CPT с Gutenberg и REST API.
Добавление кастомных таксономий для Custom Post Types
Для улучшения структуры полезно добавить таксономии, например, категории и теги, но отдельные для CPT. Создадим таксономию «Жанры» для типа «Книги».
function wordpressa_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' => 'genre'),
'show_in_rest' => true,
);
register_taxonomy('genre', array('book'), $args);
}
add_action('init', 'wordpressa_register_taxonomy_genres');Теперь в админке можно удобно структурировать книги по жанрам, что облегчит навигацию и поиск.
Как выводить Custom Post Types на фронтенде
Для отображения CPT на сайте можно использовать WP_Query с указанием типа записи. Пример вывода списка книг:
$args = array(
'post_type' => 'book',
'posts_per_page' => 10,
);
$wordpressa_books_query = new WP_Query($args);
if ($wordpressa_books_query->have_posts()) {
echo '<ul>';
while ($wordpressa_books_query->have_posts()) {
$wordpressa_books_query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
} else {
echo 'Книги не найдены.';
}
wp_reset_postdata();Этот код выводит заголовки книг в виде списка с ссылками на отдельные записи. Аналогично можно выводить отдельные поля и таксономии.
Использование мета-полей с Custom Post Types
Часто требуется добавить уникальные данные к CPT, например, автор книги, год издания и т.д. Для этого используют пользовательские мета-поля. Их можно добавить вручную через функцию add_meta_box() или с помощью плагинов, например, Advanced Custom Fields (ACF).
Пример добавления мета-поля «Год издания» через код:
function wordpressa_add_meta_box_year() {
add_meta_box(
'wordpressa_year_meta_box',
'Год издания',
'wordpressa_year_meta_box_callback',
'book',
'side'
);
}
add_action('add_meta_boxes', 'wordpressa_add_meta_box_year');
function wordpressa_year_meta_box_callback($post) {
$value = get_post_meta($post->ID, '_wordpressa_year', true);
echo '<label for="wordpressa_year_field">Год:</label>';
echo '<input type="number" id="wordpressa_year_field" name="wordpressa_year_field" value="' . esc_attr($value) . '" size="4" />';
}
function wordpressa_save_year_meta_box_data($post_id) {
if (!isset($_POST['wordpressa_year_field'])) {
return;
}
$year_data = sanitize_text_field($_POST['wordpressa_year_field']);
update_post_meta($post_id, '_wordpressa_year', $year_data);
}
add_action('save_post', 'wordpressa_save_year_meta_box_data');После добавления этого кода в админке у записей типа «Книга» появится поле для ввода года издания.
Советы по работе с Custom Post Types
- Всегда используйте уникальные префиксы для функций, чтобы избежать конфликтов (например,
wordpressa_). - Не забудьте добавить поддержку REST API (
'show_in_rest' => true) для совместимости с Gutenberg и внешними приложениями. - Для сложных мета-полей используйте проверенные плагины, например, ACF, чтобы не писать всё вручную.
- При необходимости создавайте отдельные шаблоны для CPT —
single-book.phpдля отдельной записи иarchive-book.phpдля архива. - Регулярно проверяйте работоспособность CPT после обновлений WordPress и плагинов.
Заключение
Custom Post Types — ключевой инструмент для расширения возможностей WordPress. Они позволяют создавать сайты с уникальной структурой и удобным управлением контентом. В этой статье на wordpressa.ru мы рассмотрели создание CPT, добавление таксономий и мета-полей, а также вывод данных на сайте. Используйте эти знания, чтобы сделать свои проекты более профессиональными и удобными для пользователей.