Создать Custom Post Type в WordPress: пошаговое руководство

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

Что такое Custom Post Type в WordPress и зачем он нужен

Custom Post Type — это способ расширить функциональность WordPress и добавить свои собственные типы записей, которые отличаются от стандартных постов и страниц. Например, если у вас сайт с отзывами, товарами, портфолио или событиями, создание CPT поможет структурировать данные и упростить управление ими.

Преимущества использования CPT:

  • Разделение контента по смыслу и назначению;
  • Удобство администрирования и отображения;
  • Возможность добавлять уникальные метаданные и таксономии;
  • Легкая интеграция с темами и плагинами.

Без CPT приходится использовать категории и теги, что не всегда удобно и логично.

Создаем Custom Post Type вручную через functions.php

Самый распространённый и гибкий способ — зарегистрировать CPT через функцию register_post_type в файле темы functions.php или собственном плагине. Рассмотрим пример создания CPT для «Отзывы».

Добавьте следующий код в functions.php вашей темы или в плагин:

function wpskill_register_custom_post_type_reviews() {
    $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'       => 'Искать отзывы',
        'parent_item_colon'  => 'Родительские отзывы:',
        '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'),
        'show_in_rest'       => true,
    );

    register_post_type('wpskill_reviews', $args);
}
add_action('init', 'wpskill_register_custom_post_type_reviews');

Этот код создаёт CPT с названием «Отзывы», который поддерживает заголовок, редактор, автора, миниатюру и комментарии. При этом создаётся своя страница архива с URL /reviews/.

Разбор параметров функции register_post_type

Поясним основные аргументы:

  • labels — массив с названиями и надписями в админке;
  • public — делает тип записи видимым на сайте и в админке;
  • rewrite — настройки ЧПУ, здесь задаётся слаг;
  • supports — определяет, какие метабоксы будут доступны для записи (заголовок, редактор и т.д.);
  • show_in_rest — включает поддержку REST API и блокового редактора (Gutenberg);
  • has_archive — разрешает создание страницы архива по CPT.

Добавление пользовательских полей для Custom Post Type

Часто одного редактора недостаточно, и нужно добавить дополнительные поля, например рейтинг, дату события или контактные данные. Для этого можно использовать метаполя (custom fields).

Рассмотрим, как добавить метаполе «Рейтинг» для CPT «Отзывы» с помощью мета-бокса:

function wpskill_add_reviews_meta_box() {
    add_meta_box(
        'wpskill_reviews_rating',
        'Рейтинг отзыва',
        'wpskill_reviews_rating_callback',
        'wpskill_reviews',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpskill_add_reviews_meta_box');

function wpskill_reviews_rating_callback($post) {
    wp_nonce_field('wpskill_save_reviews_rating', 'wpskill_reviews_rating_nonce');
    $value = get_post_meta($post->ID, '_wpskill_reviews_rating', true);
    echo '<label for="wpskill_reviews_rating_field">Оценка (от 1 до 5): </label>';
    echo '<input type="number" id="wpskill_reviews_rating_field" name="wpskill_reviews_rating_field" value="' . esc_attr($value) . '" min="1" max="5" step="1" />';
}

function wpskill_save_reviews_rating($post_id) {
    if (!isset($_POST['wpskill_reviews_rating_nonce'])) return;
    if (!wp_verify_nonce($_POST['wpskill_reviews_rating_nonce'], 'wpskill_save_reviews_rating')) return;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (!current_user_can('edit_post', $post_id)) return;

    if (isset($_POST['wpskill_reviews_rating_field'])) {
        $rating = intval($_POST['wpskill_reviews_rating_field']);
        if ($rating >= 1 && $rating <= 5) {
            update_post_meta($post_id, '_wpskill_reviews_rating', $rating);
        } else {
            delete_post_meta($post_id, '_wpskill_reviews_rating');
        }
    }
}
add_action('save_post', 'wpskill_save_reviews_rating');

Этот код добавляет поле для ввода оценки от 1 до 5 в боковую панель редактора записи типа «Отзывы» и сохраняет его значение в метаданных.

Используем плагины для создания Custom Post Types

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

  • Custom Post Type UI — мощный и интуитивный интерфейс для создания CPT и таксономий без кода.
    Плагин позволяет быстро регистрировать типы записей, настраивать метки, поддержку функций и многое другое.
  • Pods — расширенный фреймворк для создания CPT, таксономий и пользовательских полей. Отлично подходит для сложных проектов с большим количеством связей.
  • Advanced Custom Fields (ACF) — хотя не создаёт CPT, позволяет удобно добавлять и выводить пользовательские поля для любых типов записей, включая CPT.

Эти плагины сильно ускоряют разработку и позволяют избежать ошибок при ручном кодировании.

Вывод и отображение Custom Post Type на сайте

После регистрации CPT и добавления контента нужно правильно вывести записи на сайте. Для этого можно создать шаблон архива и отдельной записи в теме.

По умолчанию WordPress ищет файлы шаблонов по иерархии:

  • Для архива CPT — archive-wpskill_reviews.php;
  • Для отдельной записи CPT — single-wpskill_reviews.php.

Если таких файлов нет, будет использоваться archive.php и single.php.

Пример цикла вывода записей CPT на странице архива

<?php
if (have_posts()) :
    while (have_posts()) : the_post(); ?>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <div><?php the_excerpt(); ?></div>
        <div>Рейтинг: <?php echo esc_html(get_post_meta(get_the_ID(), '_wpskill_reviews_rating', true)); ?></div>
    <?php endwhile;
else :
    echo '<p>Нет отзывов.</p>';
endif;
?>

Так вы можете вывести заголовок, краткое описание и кастомное поле рейтинга.

Заключение: лучшие практики и советы

Работа с Custom Post Type — важный навык для любого разработчика WordPress. Вот несколько советов для успешной реализации:

  • Всегда используйте уникальные префиксы для функций и имён CPT, чтобы избежать конфликтов (например, wpskill_).
  • Обязательно включайте поддержку REST API (show_in_rest => true), если планируете использовать Gutenberg или API.
  • Добавляйте пользовательские поля аккуратно, проверяйте и валидируйте данные.
  • Создавайте отдельные шаблоны для CPT, чтобы кастомизировать вывод.
  • Используйте проверенные плагины для ускорения разработки, если не хотите писать всё вручную.

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

Как автоматизировать просмотр и редактирование записей в WordPress с помощью кастомных функций
15.12.2025
Как изменить разметку WooCommerce без переопределения шаблонов
04.12.2025
Как создать динамическую форму обработки в WordPress с применением AJAX
20.12.2025
Как отладить проблемы с кешированием в WordPress
28.11.2025
Как отключить автоматическое обновление WooCommerce без переопределения файлов
09.05.2026