В WordPress стандартно используются такие типы записей, как записи (posts) и страницы (pages), но часто возникает необходимость создать собственные типы записей (Custom Post Types, CPT) для более удобного и логичного управления контентом. Например, для сайта с обзорами — можно создать тип записи «Отзыв», для портфолио — «Проекты», для каталога — «Товары» и т.д.
Что такое Custom Post Type и зачем он нужен
Custom Post Type — это механизм WordPress для создания собственных типов контента, которые независимы от стандартных постов и страниц. Это позволяет структурировать сайт, сделать удобную навигацию и администрирование, а также реализовать специфический функционал для каждого типа контента.
Например, для сайта expert-review.ru, где публикуются экспертные обзоры, можно создать тип записи expert_review, чтобы отделить отзывы и обзоры от обычных новостей или блог-постов.
Использование CPT позволяет:
- Удобно группировать и фильтровать контент;
- Создавать отдельные шаблоны отображения для каждого типа записи;
- Расширять функционал, привязывать метаданные и таксономии;
- Упрощать работу редакторов и администраторов сайта.
Регистрация собственного типа записи в WordPress
Для создания CPT используется функция register_post_type(). Обычно код добавляют в файл functions.php темы или в отдельный плагин. Рассмотрим пример создания типа записи expert_review с базовыми настройками.
function expertreview_register_cpt() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'menu_name' => 'Отзывы',
'name_admin_bar' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'view_item' => 'Просмотреть отзыв',
'search_items' => 'Искать отзывы',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывы не найдены',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'reviews'),
'show_in_rest' => true, // Поддержка Gutenberg
'supports' => array('title', 'editor', 'thumbnail', 'comments'),
'menu_position' => 5,
'menu_icon' => 'dashicons-star-filled',
'capability_type' => 'post',
);
register_post_type('expert_review', $args);
}
add_action('init', 'expertreview_register_cpt');
После добавления кода в тему и обновления страницы админки появится новый пункт меню «Отзывы», где можно создавать и редактировать записи этого типа.
Добавление кастомных полей и метабоксов для типа записи
Для расширения возможностей CPT полезно добавлять пользовательские поля. Например, для отзыва можно добавить поле «Оценка эксперта». Рассмотрим, как добавить метабокс с полем оценки.
function expertreview_add_meta_box() {
add_meta_box(
'expertreview_score',
'Оценка эксперта',
'expertreview_score_meta_box_callback',
'expert_review',
'side'
);
}
add_action('add_meta_boxes', 'expertreview_add_meta_box');
function expertreview_score_meta_box_callback($post) {
wp_nonce_field('expertreview_save_meta_box_data', 'expertreview_meta_box_nonce');
$value = get_post_meta($post->ID, '_expertreview_score', true);
echo '<label for="expertreview_score_field">Оценка (от 1 до 10): </label>';
echo '<input type="number" id="expertreview_score_field" name="expertreview_score_field" min="1" max="10" value="' . esc_attr($value) . '" size="4" />';
}
function expertreview_save_meta_box_data($post_id) {
if (!isset($_POST['expertreview_meta_box_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['expertreview_meta_box_nonce'], 'expertreview_save_meta_box_data')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (!isset($_POST['expertreview_score_field'])) {
return;
}
$score = sanitize_text_field($_POST['expertreview_score_field']);
update_post_meta($post_id, '_expertreview_score', $score);
}
add_action('save_post', 'expertreview_save_meta_box_data');
Теперь при создании или редактировании отзыва можно выставлять оценку, которая сохранится в метаполе.
Вывод пользовательских типов записей и метаполей на сайте
Чтобы вывести отзывы на сайте, можно создать отдельный шаблон архива или использовать шорткод. Пример шорткода для вывода списка отзывов с оценками:
function expertreview_reviews_shortcode($atts) {
$args = array(
'post_type' => 'expert_review',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
if (!$query->have_posts()) {
return '<p>Отзывы не найдены.</p>';
}
$output = '<ul class="expert-reviews-list">';
while ($query->have_posts()) {
$query->the_post();
$score = get_post_meta(get_the_ID(), '_expertreview_score', true);
$output .= '<li><strong>' . get_the_title() . '</strong> — Оценка: ' . esc_html($score) . '/10<br/>' . get_the_excerpt() . '</li>';
}
wp_reset_postdata();
$output .= '</ul>';
return $output;
}
add_shortcode('expert_reviews', 'expertreview_reviews_shortcode');
Используйте шорткод [expert_reviews] на страницах или в записях, чтобы вывести список отзывов с оценками.
Дополнительные советы и плагины для работы с Custom Post Types
Если не хотите писать код вручную, можно воспользоваться плагинами для создания CPT, например:
- Custom Post Type UI — удобный интерфейс для регистрации типов записей и таксономий;
- Advanced Custom Fields Pro — мощный инструмент для добавления и управления кастомными полями;
- Для оптимизации и ускорения работы с CPT можно использовать плагин Clearfy Pro, который оптимизирует запросы и убирает ненужные функции.
Также стоит помнить, что для полноценной поддержки CPT в теме могут понадобиться отдельные шаблоны, например archive-expert_review.php для отображения архива и single-expert_review.php для отдельной записи.