Как создать собственный тип записи в WordPress: подробное руководство с примерами

В WordPress по умолчанию есть несколько типов записей, таких как записи (posts), страницы (pages) и вложения (attachments). Однако для многих проектов бывает необходимо создать свои собственные типы записей — Custom Post Types (CPT), чтобы структурировать контент более гибко и удобно. В этой статье мы подробно разберем, как создать CPT с нуля, как добавить к нему таксономии и метаполя, а также приведем примеры кода и рекомендации.

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

Пользовательский тип записи — это механизм WordPress, позволяющий создавать новые категории контента, отличные от стандартных записей и страниц. Например, если вы делаете сайт с каталогом товаров, событиями, отзывами, портфолио или рецептами, CPT позволяют логично разделить и организовать данные.

Использование CPT облегчает:

  • Управление контентом в админке — отдельное меню и интерфейс.
  • Разделение логики и шаблонов вывода для разных типов данных.
  • Создание удобной структуры URL и навигации.

Без CPT часто приходится использовать метаданные и таксономии к записям, что усложняет поддержку и ухудшает читаемость кода.

Как зарегистрировать собственный тип записи в WordPress: функция wpco_register_custom_post_type

Для регистрации CPT используется функция register_post_type(). Чтобы сделать код удобным и изолированным, создадим функцию с префиксом wpco_, например, wpco_register_custom_post_type().

function wpco_register_custom_post_type() {
    $labels = array(
        'name' => 'Отзывы',
        'singular_name' => 'Отзыв',
        'add_new' => 'Добавить отзыв',
        'add_new_item' => 'Добавить новый отзыв',
        'edit_item' => 'Редактировать отзыв',
        'new_item' => 'Новый отзыв',
        'view_item' => 'Просмотреть отзыв',
        'search_items' => 'Поиск отзывов',
        'not_found' => 'Отзывы не найдены',
        'not_found_in_trash' => 'В корзине отзывы не найдены',
        'menu_name' => 'Отзывы'
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'otzyvy'),
        'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
        'show_in_rest' => true,
    );

    register_post_type('wpco_review', $args);
}
add_action('init', 'wpco_register_custom_post_type');

В этом примере мы создаем тип записи «Отзывы» с поддержкой заголовка, содержимого, миниатюры и комментариев. Он будет доступен в админке и на фронтенде с архивной страницей по адресу /otzyvy/.

Пояснения к параметрам

labels — массив с названиями и текстами меню, которые будут отображаться в админке.

public — делает тип записи видимым на сайте и в админке.

has_archive — включает архивную страницу.

rewrite — задает ЧПУ для архива.

supports — какие стандартные возможности поддерживает тип записи.

show_in_rest — включение поддержки REST API и редактора Gutenberg.

Добавление таксономий к собственному типу записи

Чтобы удобно структурировать записи, к CPT можно добавить таксономии — категории и метки или свои собственные. В нашем примере с отзывами можно добавить таксономию «Тип отзыва».

function wpco_register_review_taxonomy() {
    $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-type'),
    );

    register_taxonomy('wpco_review_type', array('wpco_review'), $args);
}
add_action('init', 'wpco_register_review_taxonomy');

Теперь у отзывов будет выпадающий список с типами, который можно использовать для фильтрации и группировки.

Добавление пользовательских полей (метаполей) для CPT

Для хранения дополнительной информации, например, рейтинга отзыва, можно использовать метаполя. Есть много плагинов (Advanced Custom Fields, Meta Box), но можно сделать и на чистом PHP.

Добавим поле «Рейтинг» (от 1 до 5) на страницу редактирования записи:

function wpco_add_custom_meta_box() {
    add_meta_box(
        'wpco_review_rating',
        'Рейтинг отзыва',
        'wpco_meta_box_callback',
        'wpco_review',
        'side'
    );
}
add_action('add_meta_boxes', 'wpco_add_custom_meta_box');

function wpco_meta_box_callback($post) {
    wp_nonce_field('wpco_save_meta_box_data', 'wpco_meta_box_nonce');
    $value = get_post_meta($post->ID, '_wpco_review_rating', true);
    echo '<label for="wpco_review_rating_field">Рейтинг (1-5): </label>';
    echo '<input type="number" id="wpco_review_rating_field" name="wpco_review_rating_field" min="1" max="5" value="' . esc_attr($value) . '" size="25" />';
}

function wpco_save_meta_box_data($post_id) {
    if (!isset($_POST['wpco_meta_box_nonce']) || !wp_verify_nonce($_POST['wpco_meta_box_nonce'], 'wpco_save_meta_box_data')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (!isset($_POST['wpco_review_rating_field'])) {
        return;
    }
    $rating = sanitize_text_field($_POST['wpco_review_rating_field']);
    if ($rating < 1) $rating = 1;
    if ($rating > 5) $rating = 5;
    update_post_meta($post_id, '_wpco_review_rating', $rating);
}
add_action('save_post', 'wpco_save_meta_box_data');

Этот код добавляет поле рейтинга в сайдбар редактора, сохраняет и валидирует данные.

Вывод пользовательского типа записи на фронтенде с кастомным шаблоном

Чтобы вывести CPT на сайте, можно создать шаблон archive-wpco_review.php в теме, где будет логика вывода списка отзывов.

Пример простого цикла вывода с рейтингом:

<?php if (have_posts()) : ?>
    <ul class="wpco-reviews-list">
    <?php while (have_posts()) : the_post(); ?>
        <li>
            <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <div class="review-rating">Рейтинг: <?php echo esc_html(get_post_meta(get_the_ID(), '_wpco_review_rating', true)); ?>/5</div>
            <div class="review-content"><?php the_content(); ?></div>
        </li>
    <?php endwhile; ?>
    </ul>
<?php else : ?>
    <p>Отзывы не найдены.</p>
<?php endif; ?>

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

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

  • Custom Post Type UI — удобный интерфейс для создания CPT и таксономий без кода.
  • Advanced Custom Fields — мощный инструмент для добавления и управления метаполями.
  • Pods — расширенный фреймворк для создания CPT, таксономий и полей с гибкой настройкой.

Все они интегрируются с REST API и поддерживают редактор Gutenberg.

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

  • Используйте уникальные префиксы в названиях функций и CPT, чтобы избежать конфликтов (например, wpco_).
  • Определяйте «supports» с учетом реальных потребностей, чтобы не перегружать интерфейс.
  • Создавайте кастомные шаблоны для CPT, чтобы обеспечить уникальный дизайн и функционал.
  • Добавляйте таксономии для удобной фильтрации и навигации.
  • Следите за производительностью, особенно если CPT используются на больших сайтах.
Как отфильтровать записи по полям Advanced Custom Fields в WordPress
15.12.2025
Как использовать REST API для создания кастомных эндпойнтов в WordPress
08.12.2025
Как создать автоматический бэкап WordPress с помощью кода и плагинов
01.01.2026
Как добавить настройки в админ-панель WordPress
02.12.2025
Как добавить поддержку JSON-LD в WordPress
19.01.2026