В WordPress стандартно предусмотрены несколько типов записей, таких как «Записи» и «Страницы». Но часто возникает задача создать собственный вид записи (Custom Post Type, CPT) для более точного представления и управления специфическими данными, например, портфолио, отзывы, мероприятия и т.д. В этой статье подробно рассмотрим, как создать и настроить собственный вид записи в WordPress, а также приведём примеры кода и полезных плагинов.
Что такое собственный вид записи и зачем он нужен в WordPress
Собственный вид записи (CPT) — это дополнительный тип контента, который вы регистрируете в системе. Он позволяет структурировать данные, отделяя их от обычных записей и страниц. Это удобно для сайтов, где нужно хранить, например, товары, проекты, услуги или события.
Использование CPT улучшает организацию сайта и упрощает работу с контентом в админке. Кроме того, собственные типы записей можно выводить отдельно на фронтенде, используя шаблоны, запросы WP_Query и REST API.
Рассмотрим на практике, как создать CPT для «Отзывы» — чтобы клиенты могли оставлять свои отзывы, а вы удобно управляли ими.
Регистрация собственного вида записи через functions.php
Для регистрации CPT в WordPress используется функция register_post_type(). Регистрировать тип записи рекомендуется в хуке init, чтобы WordPress корректно инициализировал новый тип.
Пример кода для регистрации CPT «Отзывы» с префиксом wordpresses_ для функций во избежание конфликтов:
function wordpresses_register_reviews_cpt() {
$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,
'has_archive' => true,
'rewrite' => array('slug' => 'reviews'),
'menu_position' => 5,
'menu_icon' => 'dashicons-testimonial',
'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
'show_in_rest' => true
);
register_post_type('wordpresses_review', $args);
}
add_action('init', 'wordpresses_register_reviews_cpt');В этом примере:
'supports'включает стандартные возможности записи, такие как заголовок, редактор, миниатюры и комментарии.'show_in_rest'активирует поддержку REST API, что полезно для блоков Gutenberg и внешних приложений.'menu_icon'задаёт иконку в админ-панели для удобства.
После добавления этого кода в файл functions.php вашей темы или подключаемого плагина, в админке появится новый пункт меню «Отзывы».
Как использовать собственный вид записи на фронтенде и в шаблонах
Чтобы вывести записи CPT на сайте, можно создать отдельный шаблон архива или одиночной записи. Например, файл archive-wordpresses_review.php для вывода всех отзывов.
Пример простого цикла WordPress для вывода отзывов на странице архива:
if (have_posts()) :
while (have_posts()) : the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo '<div>' . get_the_content() . '</div>';
endwhile;
else :
echo 'Отзывы не найдены.';
endif;Можно также использовать WP_Query для выборки отзывов в любом месте темы:
$args = array(
'post_type' => 'wordpresses_review',
'posts_per_page' => 10
);
$reviews_query = new WP_Query($args);
if ($reviews_query->have_posts()) {
while ($reviews_query->have_posts()) {
$reviews_query->the_post();
echo '<h3>' . get_the_title() . '</h3>';
echo '<p>' . get_the_excerpt() . '</p>';
}
wp_reset_postdata();
} else {
echo 'Отзывы не найдены.';
}Расширение функционала: таксономии и мета-поля для CPT
Для удобного управления и фильтрации отзывов можно добавить собственные таксономии — категории и теги, например, «Тип отзыва» (положительный, нейтральный, отрицательный).
Регистрация таксономии для CPT:
function wordpresses_register_review_taxonomy() {
$labels = array(
'name' => 'Типы отзывов',
'singular_name' => 'Тип отзыва',
'search_items' => 'Поиск типов отзывов',
'all_items' => 'Все типы',
'edit_item' => 'Редактировать тип',
'add_new_item' => 'Добавить новый тип',
'menu_name' => 'Типы отзывов'
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_in_rest' => true,
'rewrite' => array('slug' => 'review-type')
);
register_taxonomy('wordpresses_review_type', 'wordpresses_review', $args);
}
add_action('init', 'wordpresses_register_review_taxonomy');Также можно добавить мета-поля для хранения дополнительной информации, например, оценки или даты отзыва. Для этого удобно использовать плагины, такие как My Popup для создания пользовательских форм или ручное добавление через мета-боксы.
Пример добавления мета-поля «Оценка» для отзывов
Добавим мета-бокс в админке для CPT «Отзывы» с оценкой от 1 до 5:
function wordpresses_add_review_rating_meta_box() {
add_meta_box(
'wordpresses_review_rating',
'Оценка отзыва',
'wordpresses_render_review_rating_meta_box',
'wordpresses_review',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wordpresses_add_review_rating_meta_box');
function wordpresses_render_review_rating_meta_box($post) {
wp_nonce_field('wordpresses_save_review_rating', 'wordpresses_review_rating_nonce');
$value = get_post_meta($post->ID, '_wordpresses_review_rating', true);
echo '<label for="wordpresses_review_rating_field">Оценка (1-5):</label> ';
echo '<input type="number" id="wordpresses_review_rating_field" name="wordpresses_review_rating_field" min="1" max="5" value="' . esc_attr($value) . '" />';
}
function wordpresses_save_review_rating_meta_box_data($post_id) {
if (!isset($_POST['wordpresses_review_rating_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wordpresses_review_rating_nonce'], 'wordpresses_save_review_rating')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wordpresses_review_rating_field'])) {
$rating = intval($_POST['wordpresses_review_rating_field']);
if ($rating >= 1 && $rating <= 5) {
update_post_meta($post_id, '_wordpresses_review_rating', $rating);
} else {
delete_post_meta($post_id, '_wordpresses_review_rating');
}
}
}
add_action('save_post', 'wordpresses_save_review_rating_meta_box_data');Теперь при редактировании каждого отзыва можно указать оценку, которая будет храниться в мета-данных записи.
Полезные плагины для работы с собственными типами записей
Если не хочется писать код вручную, попробуйте плагины для создания CPT и таксономий:
- Custom Post Type UI — удобный интерфейс для регистрации CPT и таксономий без кода.
- Advanced Custom Fields (ACF) — мощный инструмент для добавления мета-полей и кастомизации интерфейса редактирования.
- Clearfy Pro — оптимизатор и настройщик WordPress, который может помочь с производительностью CPT при большом объёме данных.
Использование плагинов позволяет быстро создавать и настраивать сложные структуры данных, экономя время и снижая риск ошибок.
Советы по оптимизации и безопасности собственных видов записей
При работе с CPT важно учитывать следующие моменты:
- Всегда используйте уникальные префиксы для функций и слагов, чтобы избежать конфликтов с другими плагинами и темами.
- Если CPT публичные, убедитесь, что для них правильно настроены права доступа и фильтры, чтобы избежать нежелательного просмотра или редактирования.
- Для больших сайтов с множеством записей используйте кэширование запросов и оптимизируйте индексирование базы данных, чтобы не замедлять работу сайта.
- При добавлении мета-полей проверяйте и фильтруйте данные при сохранении для безопасности.
Например, можно дополнить код сохранения мета-поля дополнительной валидацией и санитизацией.