В WordPress по умолчанию есть несколько типов записей: записи (posts), страницы (pages), вложения и т.д. Но для многих проектов этого недостаточно. Например, если вы делаете сайт с каталогом товаров, портфолио, мероприятиями или отзывами, удобнее создать собственный тип записи (Custom Post Type, CPT). Это позволит структурировать контент и управлять им отдельно от обычных записей.
Что такое Custom Post Type и зачем он нужен
Custom Post Type — это пользовательский тип контента, который вы регистрируете в WordPress для хранения специфичных данных. CPT помогает разграничить контент, улучшить навигацию и сделать админку более удобной. Вместо того чтобы хранить все в обычных записях, вы можете создать, например, тип «Отзывы» или «Мероприятия» с собственными полями и таксономиями.
Ключевые преимущества использования CPT:
- Упорядочивание контента по типам
- Возможность добавить уникальные метаданные и таксономии
- Лучшее SEO за счет разделения контента
- Улучшение пользовательского интерфейса в админке
Как зарегистрировать Custom Post Type в WordPress
Для регистрации CPT используется функция register_post_type(). Регистрировать тип записи лучше в хуке init. Ниже пример регистрации CPT «Отзывы» с базовыми настройками:
add_action('init', 'wpvip_register_custom_post_type_reviews');
function wpvip_register_custom_post_type_reviews() {
$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,
'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'),
);
register_post_type('wpvip_reviews', $args);
}Этот код добавит новый раздел в админке с названием «Отзывы», где можно создавать и редактировать записи этого типа.
Настройка поддержки метаданных и таксономий
Чтобы расширить функциональность CPT, добавим поддержку пользовательских полей и таксономий. Например, для отзывов удобно иметь рейтинги и категории.
Добавление пользовательских таксономий
Регистрация таксономии «Категории отзывов» для типа отзывов:
add_action('init', 'wpvip_register_taxonomy_review_category');
function wpvip_register_taxonomy_review_category() {
$labels = array(
'name' => 'Категории отзывов',
'singular_name' => 'Категория отзыва',
'search_items' => 'Искать категории',
'all_items' => 'Все категории',
'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' => 'review-category'),
);
register_taxonomy('wpvip_review_category', array('wpvip_reviews'), $args);
}Добавление пользовательских полей (мета-полей) с помощью плагина Advanced Custom Fields
Плагин Advanced Custom Fields (ACF) позволяет легко добавить мета-поля без кодинга. Для рейтинга можно создать поле "Оценка" типа "Число" с ограничением от 1 до 5.
Если хотите добавить мета-поля вручную, пример добавления рейтинга через код:
add_action('add_meta_boxes', 'wpvip_add_reviews_meta_box');
function wpvip_add_reviews_meta_box() {
add_meta_box('wpvip_reviews_rating', 'Рейтинг отзыва', 'wpvip_reviews_rating_meta_box_callback', 'wpvip_reviews', 'side', 'default');
}
function wpvip_reviews_rating_meta_box_callback($post) {
wp_nonce_field('wpvip_save_reviews_rating', 'wpvip_reviews_rating_nonce');
$value = get_post_meta($post->ID, '_wpvip_reviews_rating', true);
echo '<label for="wpvip_reviews_rating_field">Оценка (1-5):</label> ';
echo '<input type="number" id="wpvip_reviews_rating_field" name="wpvip_reviews_rating_field" value="' . esc_attr($value) . '" min="1" max="5" />';
}
add_action('save_post', 'wpvip_save_reviews_rating_meta_box_data');
function wpvip_save_reviews_rating_meta_box_data($post_id) {
if (!isset($_POST['wpvip_reviews_rating_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wpvip_reviews_rating_nonce'], 'wpvip_save_reviews_rating')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (!isset($_POST['wpvip_reviews_rating_field'])) {
return;
}
$rating = intval($_POST['wpvip_reviews_rating_field']);
if ($rating < 1) $rating = 1;
if ($rating > 5) $rating = 5;
update_post_meta($post_id, '_wpvip_reviews_rating', $rating);
}Вывод Custom Post Type на сайте: примеры кода
Чтобы вывести отзывы на странице сайта, используйте WP_Query с указанием типа записи:
$args = array(
'post_type' => 'wpvip_reviews',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC',
);
$reviews_query = new WP_Query($args);
if ($reviews_query->have_posts()) {
echo '<ul class="wpvip-reviews-list">';
while ($reviews_query->have_posts()) {
$reviews_query->the_post();
$rating = get_post_meta(get_the_ID(), '_wpvip_reviews_rating', true);
echo '<li><h3>' . get_the_title() . '</h3>';
echo '<div class="review-rating">Рейтинг: ' . esc_html($rating) . '/5</div>';
echo '<div class="review-content">' . get_the_content() . '</div></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Отзывы не найдены.</p>';
}Использование шорткода для вывода отзывов
Чтобы удобно вставлять отзывы в статьи и страницы, создадим шорткод:
add_shortcode('wpvip_reviews_list', 'wpvip_reviews_list_shortcode');
function wpvip_reviews_list_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 5,
), $atts, 'wpvip_reviews_list');
$args = array(
'post_type' => 'wpvip_reviews',
'posts_per_page' => intval($atts['count']),
'orderby' => 'date',
'order' => 'DESC',
);
$reviews_query = new WP_Query($args);
ob_start();
if ($reviews_query->have_posts()) {
echo '<ul class="wpvip-reviews-list">';
while ($reviews_query->have_posts()) {
$reviews_query->the_post();
$rating = get_post_meta(get_the_ID(), '_wpvip_reviews_rating', true);
echo '<li><h3>' . get_the_title() . '</h3>';
echo '<div class="review-rating">Рейтинг: ' . esc_html($rating) . '/5</div>';
echo '<div class="review-content">' . get_the_content() . '</div></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Отзывы не найдены.</p>';
}
return ob_get_clean();
}Рекомендации по SEO и производительности для Custom Post Type
При создании CPT важно правильно настроить пермалинки (ЧПУ). В параметре rewrite укажите понятный slug. Для лучшего SEO используйте отдельные таксономии для фильтрации и категоризации.
Для повышения производительности избегайте избыточных запросов к базе, используйте кэширование (например, Transients API или внешние плагины кэширования). Если у вас большой объем CPT, рассмотрите добавление пагинации и индексации метаданных.
Также помните о правах доступа — если CPT предназначен для публичного просмотра, устанавливайте 'public' => true. Для приватного контента используйте соответствующие настройки.
Полезные плагины для работы с Custom Post Type
- Custom Post Type UI — позволяет создавать CPT и таксономии через интерфейс без кода.
- Advanced Custom Fields (ACF) — добавляет удобное управление пользовательскими полями.
- Pods — расширенный инструмент для создания и управления CPT и метаполями.
- Toolset Types — мощный плагин для создания сложных типов контента и связей между ними.
Использование этих плагинов значительно упрощает создание и поддержку сложного контента в WordPress.