В WordPress по умолчанию есть несколько типов записей: посты, страницы, вложения и другие. Но часто для проектов требуется создать свои собственные типы контента — Custom Post Types (CPT). В этой статье мы подробно разберем, как создать и настроить Custom Post Type в WordPress, рассмотрим примеры кода, а также полезные плагины для работы с CPT.
Что такое Custom Post Type в WordPress и зачем он нужен
Custom Post Type — это способ расширить функциональность WordPress и добавить свои собственные типы записей, которые отличаются от стандартных постов и страниц. Например, если у вас сайт с отзывами, товарами, портфолио или событиями, создание CPT поможет структурировать данные и упростить управление ими.
Преимущества использования CPT:
- Разделение контента по смыслу и назначению;
- Удобство администрирования и отображения;
- Возможность добавлять уникальные метаданные и таксономии;
- Легкая интеграция с темами и плагинами.
Без CPT приходится использовать категории и теги, что не всегда удобно и логично.
Создаем Custom Post Type вручную через functions.php
Самый распространённый и гибкий способ — зарегистрировать CPT через функцию register_post_type в файле темы functions.php или собственном плагине. Рассмотрим пример создания CPT для «Отзывы».
Добавьте следующий код в functions.php вашей темы или в плагин:
function wpskill_register_custom_post_type_reviews() {
$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' => 'reviews'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
'show_in_rest' => true,
);
register_post_type('wpskill_reviews', $args);
}
add_action('init', 'wpskill_register_custom_post_type_reviews');Этот код создаёт CPT с названием «Отзывы», который поддерживает заголовок, редактор, автора, миниатюру и комментарии. При этом создаётся своя страница архива с URL /reviews/.
Разбор параметров функции register_post_type
Поясним основные аргументы:
labels— массив с названиями и надписями в админке;public— делает тип записи видимым на сайте и в админке;rewrite— настройки ЧПУ, здесь задаётся слаг;supports— определяет, какие метабоксы будут доступны для записи (заголовок, редактор и т.д.);show_in_rest— включает поддержку REST API и блокового редактора (Gutenberg);has_archive— разрешает создание страницы архива по CPT.
Добавление пользовательских полей для Custom Post Type
Часто одного редактора недостаточно, и нужно добавить дополнительные поля, например рейтинг, дату события или контактные данные. Для этого можно использовать метаполя (custom fields).
Рассмотрим, как добавить метаполе «Рейтинг» для CPT «Отзывы» с помощью мета-бокса:
function wpskill_add_reviews_meta_box() {
add_meta_box(
'wpskill_reviews_rating',
'Рейтинг отзыва',
'wpskill_reviews_rating_callback',
'wpskill_reviews',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpskill_add_reviews_meta_box');
function wpskill_reviews_rating_callback($post) {
wp_nonce_field('wpskill_save_reviews_rating', 'wpskill_reviews_rating_nonce');
$value = get_post_meta($post->ID, '_wpskill_reviews_rating', true);
echo '<label for="wpskill_reviews_rating_field">Оценка (от 1 до 5): </label>';
echo '<input type="number" id="wpskill_reviews_rating_field" name="wpskill_reviews_rating_field" value="' . esc_attr($value) . '" min="1" max="5" step="1" />';
}
function wpskill_save_reviews_rating($post_id) {
if (!isset($_POST['wpskill_reviews_rating_nonce'])) return;
if (!wp_verify_nonce($_POST['wpskill_reviews_rating_nonce'], 'wpskill_save_reviews_rating')) return;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wpskill_reviews_rating_field'])) {
$rating = intval($_POST['wpskill_reviews_rating_field']);
if ($rating >= 1 && $rating <= 5) {
update_post_meta($post_id, '_wpskill_reviews_rating', $rating);
} else {
delete_post_meta($post_id, '_wpskill_reviews_rating');
}
}
}
add_action('save_post', 'wpskill_save_reviews_rating');Этот код добавляет поле для ввода оценки от 1 до 5 в боковую панель редактора записи типа «Отзывы» и сохраняет его значение в метаданных.
Используем плагины для создания Custom Post Types
Если не хочется ковыряться с кодом, можно использовать плагины. Вот несколько популярных и удобных:
- Custom Post Type UI — мощный и интуитивный интерфейс для создания CPT и таксономий без кода.
Плагин позволяет быстро регистрировать типы записей, настраивать метки, поддержку функций и многое другое. - Pods — расширенный фреймворк для создания CPT, таксономий и пользовательских полей. Отлично подходит для сложных проектов с большим количеством связей.
- Advanced Custom Fields (ACF) — хотя не создаёт CPT, позволяет удобно добавлять и выводить пользовательские поля для любых типов записей, включая CPT.
Эти плагины сильно ускоряют разработку и позволяют избежать ошибок при ручном кодировании.
Вывод и отображение Custom Post Type на сайте
После регистрации CPT и добавления контента нужно правильно вывести записи на сайте. Для этого можно создать шаблон архива и отдельной записи в теме.
По умолчанию WordPress ищет файлы шаблонов по иерархии:
- Для архива CPT —
archive-wpskill_reviews.php; - Для отдельной записи CPT —
single-wpskill_reviews.php.
Если таких файлов нет, будет использоваться archive.php и single.php.
Пример цикла вывода записей CPT на странице архива
<?php
if (have_posts()) :
while (have_posts()) : the_post(); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div><?php the_excerpt(); ?></div>
<div>Рейтинг: <?php echo esc_html(get_post_meta(get_the_ID(), '_wpskill_reviews_rating', true)); ?></div>
<?php endwhile;
else :
echo '<p>Нет отзывов.</p>';
endif;
?>Так вы можете вывести заголовок, краткое описание и кастомное поле рейтинга.
Заключение: лучшие практики и советы
Работа с Custom Post Type — важный навык для любого разработчика WordPress. Вот несколько советов для успешной реализации:
- Всегда используйте уникальные префиксы для функций и имён CPT, чтобы избежать конфликтов (например,
wpskill_). - Обязательно включайте поддержку REST API (
show_in_rest => true), если планируете использовать Gutenberg или API. - Добавляйте пользовательские поля аккуратно, проверяйте и валидируйте данные.
- Создавайте отдельные шаблоны для CPT, чтобы кастомизировать вывод.
- Используйте проверенные плагины для ускорения разработки, если не хотите писать всё вручную.
Следуя этим рекомендациям, вы сможете легко расширять функционал сайта и создавать удобные структуры контента под любые задачи.