Как создать Custom Post Type в WordPress с примерами кода

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

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

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

Использование кастомных типов записей позволяет:

  • Четко структурировать контент;
  • Создавать уникальные шаблоны отображения;
  • Упростить работу с админкой для клиентов;
  • Поддерживать разные типы контента без мешанины в стандартных записях.

Как создать Custom Post Type вручную через functions.php

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

function wpcourse_register_reviews_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' => 'otzyvy'),
        'show_in_rest'       => true, // поддержка Gutenberg
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'comments'),
        'menu_icon'          => 'dashicons-testimonial',
    );

    register_post_type('wpcourse_reviews', $args);
}
add_action('init', 'wpcourse_register_reviews_cpt');

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

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

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

Использование плагинов для создания Custom Post Type

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

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

Например, в Custom Post Type UI вы просто добавляете новый тип, задаёте ярлык, слаг, возможности и сохраняете. Плагин автоматически зарегистрирует CPT, и вы сможете использовать его в шаблонах.

Как использовать Custom Post Type в шаблонах темы

После создания CPT нужно вывести записи на сайте. Для этого создается отдельный файл шаблона архива, например, archive-wpcourse_reviews.php. В нем можно использовать стандартный Loop WordPress:

<?php get_header(); ?>
<div class="content-area">
  <main class="site-main">
    <h1>Отзывы</h1>
    <?php if ( have_posts() ) : ?>
      <?php while ( have_posts() ) : the_post(); ?>
        <article id="post-<?php the_ID(); ?>">
          <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
          <div class="entry-content"><?php the_content(); ?></div>
        </article>
      <?php endwhile; ?>
    <?php else : ?>
      <p>Отзывы не найдены.</p>
    <?php endif; ?>
  </main>
</div>
<?php get_footer(); ?>

Для одиночной записи можно создать файл single-wpcourse_reviews.php с аналогичной структурой.

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

Для расширения функционала кастомного типа часто нужны дополнительные мета-поля, например, рейтинг, дата события или контактные данные.

Самое простое решение — использовать плагин Advanced Custom Fields (ACF). Он позволяет создавать группы полей и привязывать их к нужному CPT.

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

function wpcourse_add_reviews_metabox() {
    add_meta_box(
        'wpcourse_review_rating',
        'Рейтинг',
        'wpcourse_render_review_rating_metabox',
        'wpcourse_reviews',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpcourse_add_reviews_metabox');

function wpcourse_render_review_rating_metabox($post) {
    $value = get_post_meta($post->ID, '_wpcourse_review_rating', true);
    echo '<label for="wpcourse_review_rating_field">Оценка (1-5):</label>';
    echo '<input type="number" id="wpcourse_review_rating_field" name="wpcourse_review_rating_field" min="1" max="5" value="' . esc_attr($value) . '" />';
}

function wpcourse_save_review_rating($post_id) {
    if (array_key_exists('wpcourse_review_rating_field', $_POST)) {
        update_post_meta(
            $post_id,
            '_wpcourse_review_rating',
            intval($_POST['wpcourse_review_rating_field'])
        );
    }
}
add_action('save_post', 'wpcourse_save_review_rating');

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

Вывод дополнительных полей в шаблонах Custom Post Type

Чтобы вывести рейтинг в шаблоне одиночной записи, используйте функцию:

<?php
$rating = get_post_meta(get_the_ID(), '_wpcourse_review_rating', true);
if ($rating) {
    echo '<p>Рейтинг: ' . esc_html($rating) . ' из 5</p>';
}
?>

Это позволит красиво показать дополнительную информацию посетителям сайта.

Резюме и рекомендации по работе с Custom Post Types

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

Рекомендации:

  • Используйте префиксы в названиях функций и CPT для избежания конфликтов (как wpcourse_ в примерах).
  • Для простых сайтов подойдет ручное создание CPT в functions.php, для сложных — плагины.
  • Добавляйте дополнительные поля для расширения функционала, используя ACF или собственные мета-боксы.
  • Создавайте отдельные шаблоны для CPT для удобного отображения и SEO.

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

Как запретить изменение стоимости товара в WooCommerce после оформления заказа
30.05.2026
Как удалить неиспользуемые таксономии в WordPress
03.01.2026
Как удалить неиспользуемые meta данные в WordPress без плагинов
06.02.2026
Как использовать хук WooCommerce 'woocommerce_order_status_changed' для автоматизации действий при смене статуса заказа
28.04.2026
Как добавить временную активацию плагинов WordPress для тестирования
17.02.2026

Хотите научиться создавать сайты и зарабатывать на этом от 30 000 рублей в месяц?

Записаться на курс сейчас