Как создать и использовать кастомные типы записей в WordPress

Кастомные типы записей (Custom Post Types, CPT) — один из самых мощных инструментов WordPress, позволяющий расширять функциональность сайта и структурировать контент по своим правилам. Если вы ведете блог, магазин, каталог или любой другой проект, где стандартных записей (постов) и страниц недостаточно, кастомные типы записей помогут организовать данные максимально удобно.

Что такое кастомные типы записей и зачем они нужны в WordPress

По умолчанию WordPress поставляется с несколькими типами записей: посты, страницы, вложения и т.д. Однако нередко возникает необходимость создать уникальный тип контента, например, товары, проекты, отзывы, события и др. Кастомные типы записей позволяют создать отдельную сущность с собственным набором полей, меток и логикой отображения.

Это дает следующие преимущества:

  • Упрощение навигации и управления контентом в админке;
  • Возможность создавать отдельные шаблоны для разных типов контента;
  • Повышение SEO за счет структурированного контента;
  • Гибкость при разработке сложных сайтов.

Кастомные типы записей создаются с помощью функции register_post_type(), которую необходимо корректно зарегистрировать в файле functions.php темы или в собственном плагине.

Как зарегистрировать кастомный тип записи на примере «Отзывы»

Ниже пример создания CPT «Отзывы» с метками, поддержкой заголовка, редактора и миниатюры:

function wpchecker_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'),
        'supports' => array('title', 'editor', 'thumbnail'),
        'show_in_rest' => true,
    );

    register_post_type('wpchecker_review', $args);
}
add_action('init', 'wpchecker_register_reviews_cpt');

В этом коде мы создаем новый тип записи с именем wpchecker_review. Благодаря параметру show_in_rest его можно использовать с Gutenberg и REST API.

Добавление кастомных полей к типу записи с помощью метабоксов

Для хранения дополнительных данных отзывов, например, имени автора и рейтинга, создадим метабоксы.

Пример добавления метабоксов:

function wpchecker_add_reviews_metabox() {
    add_meta_box(
        'wpchecker_review_details',
        'Детали отзыва',
        'wpchecker_render_reviews_metabox',
        'wpchecker_review',
        'normal',
        'default'
    );
}
add_action('add_meta_boxes', 'wpchecker_add_reviews_metabox');

function wpchecker_render_reviews_metabox($post) {
    wp_nonce_field('wpchecker_save_review_metabox', 'wpchecker_review_nonce');

    $author = get_post_meta($post->ID, '_wpchecker_review_author', true);
    $rating = get_post_meta($post->ID, '_wpchecker_review_rating', true);

    echo '<p><label>Автор отзыва: <input type="text" name="wpchecker_review_author" value="' . esc_attr($author) . '" /></label></p>';
    echo '<p><label>Рейтинг (1-5): <input type="number" name="wpchecker_review_rating" min="1" max="5" value="' . esc_attr($rating) . '" /></label></p>';
}

function wpchecker_save_review_metabox($post_id) {
    if (!isset($_POST['wpchecker_review_nonce']) || !wp_verify_nonce($_POST['wpchecker_review_nonce'], 'wpchecker_save_review_metabox')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (isset($_POST['wpchecker_review_author'])) {
        update_post_meta($post_id, '_wpchecker_review_author', sanitize_text_field($_POST['wpchecker_review_author']));
    }
    if (isset($_POST['wpchecker_review_rating'])) {
        update_post_meta($post_id, '_wpchecker_review_rating', intval($_POST['wpchecker_review_rating']));
    }
}
add_action('save_post', 'wpchecker_save_review_metabox');

Теперь при редактировании отзыва появятся поля для ввода имени автора и рейтинга. Эти данные сохраняются в метаданных записи.

Вывод кастомных типов записей и их метаданных на сайте

Для вывода отзывов на фронтенде можно создать шаблон архива archive-wpchecker_review.php или использовать WP_Query в любом месте темы:

$args = array(
    'post_type' => 'wpchecker_review',
    'posts_per_page' => 10,
);
$reviews = new WP_Query($args);
if ($reviews->have_posts()) {
    echo '<ul>';
    while ($reviews->have_posts()) {
        $reviews->the_post();
        $author = get_post_meta(get_the_ID(), '_wpchecker_review_author', true);
        $rating = get_post_meta(get_the_ID(), '_wpchecker_review_rating', true);
        echo '<li><h3>' . get_the_title() . '</h3>';
        echo '<p>' . get_the_content() . '</p>';
        echo '<p><strong>Автор:</strong> ' . esc_html($author) . '</p>';
        echo '<p><strong>Рейтинг:</strong> ' . intval($rating) . '/5</p></li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo '<p>Отзывы не найдены.</p>';
}

Такой подход дает полный контроль над выводом и позволяет стилизовать контент под дизайн сайта.

Полезные плагины для работы с кастомными типами записей

Если вы предпочитаете не писать код вручную, рекомендуем использовать проверенные плагины:

  • Custom Post Type UI — удобный интерфейс для создания и управления CPT и таксономиями без кода.
  • Advanced Custom Fields — позволяет создавать сложные поля и метабоксы с GUI.
  • Clearfy Pro — плагин для оптимизации и настройки WordPress, частично поддерживает расширение функционала CPT.

Советы по работе с кастомными типами записей

При работе с CPT учитывайте следующие моменты:

  • Всегда используйте уникальные префиксы для функций и названий типов, чтобы избежать конфликтов с другими плагинами или темами.
  • Не забывайте про поддержку REST API, если планируете использовать Gutenberg или создавать SPA на базе WordPress.
  • Оптимизируйте запросы и индексацию, особенно если CPT будут добавлены в поиск или в списки на сайте.
  • Для сложных структур используйте кастомные таксономии (категории и метки) вместе с CPT.
  • Тестируйте работу CPT на разных версиях PHP и WordPress, чтобы избежать проблем с совместимостью.
WooCommerce: решение проблемы с неработающим оповещением о новом заказе
28.04.2026
WooCommerce: как установить и настроить дополнительные поля для заказов
18.05.2026
Создание собственного плагина WordPress: полный гайд для разработчиков
11.11.2025
Как избежать проблем с перенаправлениями в WordPress
27.03.2026
Как правильно удалить метаданные в WordPress без повреждений
05.12.2025