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

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

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

Собственный тип поста — это дополнительный вид контента, который можно создавать и редактировать в админке WordPress, как обычные записи, но с другой логикой и структурой. Например, если у вас сайт с фильмами, можно завести CPT «Фильмы», где будут свои поля и шаблоны.

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

Для создания CPT чаще всего используется функция register_post_type(). Рассмотрим детально, как с ней работать.

Как зарегистрировать собственный тип поста — подробный пример с описанием параметров

Чтобы добавить CPT, нужно прописать функцию регистрации и подключить её к хуку init. Вот простой пример для CPT «Проекты»:

function wpreg_register_projects_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' => 'projects'),
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt'),
        'show_in_rest'       => true,
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-portfolio',
    );
    register_post_type('wpreg_project', $args);
}
add_action('init', 'wpreg_register_projects_cpt');

Здесь мы задаём метки для интерфейса, делаем тип публичным, разрешаем архив, настраиваем URL через rewrite, включаем поддержку заголовка, редактора, миниатюр и анонсов, а также поддержку REST API для работы с Gutenberg и внешними приложениями.

Обратите внимание, что в названии типа поста wpreg_project мы добавили префикс wpreg_ — хорошая практика для избежания конфликтов с другими плагинами и темами.

Расширение функционала: добавление таксономий и метаполей для CPT

Чтобы CPT был максимально удобен, часто добавляют собственные таксономии (категории, теги) и метаполя (дополнительные данные).

Добавление таксономии

Например, создадим таксономию «Тип проекта» для нашего CPT «Проекты»:

function wpreg_register_project_taxonomy() {
    $labels = array(
        'name'              => 'Типы проектов',
        'singular_name'     => 'Тип проекта',
        'search_items'      => 'Искать типы проектов',
        'all_items'         => 'Все типы проектов',
        'edit_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' => 'project-type'),
    );
    register_taxonomy('wpreg_project_type', array('wpreg_project'), $args);
}
add_action('init', 'wpreg_register_project_taxonomy');

Таксономия «Тип проекта» позволит удобно фильтровать и группировать проекты в админке и на сайте.

Добавление метаполей через ACF и кодом

Для метаполей можно использовать плагин Clearfy Pro или Advanced Custom Fields. Но допустим, мы сделаем простое поле даты начала проекта кодом.

function wpreg_add_custom_meta_box() {
    add_meta_box(
        'wpreg_project_start',
        'Дата начала проекта',
        'wpreg_project_start_callback',
        'wpreg_project',
        'side'
    );
}
add_action('add_meta_boxes', 'wpreg_add_custom_meta_box');

function wpreg_project_start_callback($post) {
    wp_nonce_field('wpreg_save_project_start', 'wpreg_project_start_nonce');
    $value = get_post_meta($post->ID, '_wpreg_project_start', true);
    echo '<label for="wpreg_project_start_field">Дата начала:</label> ';
    echo '<input type="date" id="wpreg_project_start_field" name="wpreg_project_start_field" value="'.esc_attr($value).'" />';
}

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

    if (isset($_POST['wpreg_project_start_field'])) {
        update_post_meta($post_id, '_wpreg_project_start', sanitize_text_field($_POST['wpreg_project_start_field']));
    }
}
add_action('save_post', 'wpreg_save_project_start_meta');

Этот код добавляет метабокс с полем даты в редакторе проекта и сохраняет значение в мета данных.

Отображение собственных типов постов на сайте — шаблоны и запросы

Для вывода CPT в теме создайте файл archive-wpreg_project.php для архива и single-wpreg_project.php для единичного поста. В них можно использовать обычные циклы WordPress.

Пример простого цикла для архива:

<?php if(have_posts()) : ?>
    <ul>
    <?php while(have_posts()) : the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
    </ul>
<?php else : ?>
    <p>Проекты не найдены.</p>
<?php endif; ?>

Для выборки проектов с фильтрацией по таксономиям используйте WP_Query:

$args = array(
    'post_type' => 'wpreg_project',
    'tax_query' => array(
        array(
            'taxonomy' => 'wpreg_project_type',
            'field'    => 'slug',
            'terms'    => 'web',
        ),
    ),
);
$query = new WP_Query($args);

Так вы получите проекты только с типом «web».

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

Хотя CPT легко создать вручную, есть плагины, которые облегчают работу и настройку:

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

Используйте эти инструменты, если не хотите писать код вручную или хотите расширенный функционал.

Советы и лучшие практики при работе с собственными типами постов

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

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

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

Как отключить и удалить Gutenberg в WordPress без оставшегося кода
21.02.2026
Как создать и настроить пользовательское агентство в WordPress
22.03.2026
Как использовать WPReg_cron для автоматизации задач в WordPress
11.04.2026
Как удалить неиспользуемые таксономии и термины в WordPress
02.01.2026
Как создать уникальный shortcode с атрибутами в WordPress
27.02.2026