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

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

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

Стандартные типы постов в WordPress — это post и page. Однако зачастую для проектов нужно больше гибкости: например, создать раздел с отзывами, портфолио, мероприятиями или товарами, которые отличаются по структуре и логике отображения.

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

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

Регистрация кастомного типа поста через functions.php

Самый распространённый способ — добавить код регистрации CPT в файл functions.php вашей темы или в отдельный плагин. Ниже приведён пример функции wparticles_register_custom_post_type, которая регистрирует кастомный тип поста «Проекты».

function wparticles_register_custom_post_type() {
    $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' => 'projects'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'show_in_rest'       => true, // Включаем поддержку REST API
    );
    register_post_type('wparticles_project', $args);
}
add_action('init', 'wparticles_register_custom_post_type');

Обратите внимание на ключевые параметры:

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

Настройка таксономий для кастомных типов постов

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

Пример добавления таксономии «Тип проекта» для CPT «Проекты»:

function wparticles_register_project_taxonomy() {
    $labels = array(
        'name'              => 'Типы проектов',
        'singular_name'     => 'Тип проекта',
        'search_items'      => 'Поиск типов проектов',
        'all_items'         => 'Все типы проектов',
        'parent_item'       => 'Родительский тип',
        'parent_item_colon' => 'Родительский тип:',
        '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' => 'project-type'),
        'show_in_rest'      => true,
    );
    register_taxonomy('wparticles_project_type', array('wparticles_project'), $args);
}
add_action('init', 'wparticles_register_project_taxonomy');

Иерархическая таксономия похожа на категории, а неиерархическая — на метки. Выбирайте в зависимости от потребностей.

Вывод кастомных типов постов в шаблонах

Для отображения кастомных типов постов на сайте нужно создать отдельные шаблоны. WordPress автоматически ищет файлы по шаблону:

  • single-{post_type}.php — для одиночной записи;
  • archive-{post_type}.php — для архивной страницы.

Если их нет, используется single.php и archive.php.

Пример простого вывода списка проектов в archive-wparticles_project.php:

<?php get_header(); ?>
<h1>Наши проекты</h1>
<?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; ?>
<?php get_footer(); ?>

Для более сложного вывода можно использовать WP_Query с параметром post_type:

$args = array(
    'post_type' => 'wparticles_project',
    'posts_per_page' => 10,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        // выводим контент
    }
    wp_reset_postdata();
}

Плагины для удобного создания кастомных типов постов

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

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

Использование таких плагинов экономит время и снижает вероятность ошибок, особенно для новичков.

Рекомендации по работе с кастомными типами постов

Несколько советов, которые помогут избежать проблем при работе с CPT:

  • Всегда используйте уникальные префиксы в названиях типов и таксономий, чтобы избежать конфликтов с другими плагинами и темами. В нашем случае — префикс wparticles_.
  • Подключайте поддержку REST API (show_in_rest = true), если планируете использовать Gutenberg или внешние приложения.
  • Создавайте отдельные шаблоны для CPT, чтобы контролировать внешний вид и логику вывода.
  • При изменении параметров CPT не забывайте сбрасывать правила перезаписи URL, зайдя в настройки > постоянные ссылки и нажав «Сохранить». Иначе могут возникнуть 404 ошибки.
  • Для добавления метаполей используйте Advanced Custom Fields (ACF) или создавайте собственные метабоксы с помощью хуков WordPress.

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

Для расширения функционала CPT можно добавить собственные поля через метабоксы. Пример функции для добавления поля «Клиент проекта» в редактор:

function wparticles_add_custom_meta_box() {
    add_meta_box(
        'wparticles_client_meta',
        'Клиент проекта',
        'wparticles_client_meta_box_callback',
        'wparticles_project',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wparticles_add_custom_meta_box');

function wparticles_client_meta_box_callback($post) {
    wp_nonce_field('wparticles_save_client_meta', 'wparticles_client_meta_nonce');
    $value = get_post_meta($post->ID, '_wparticles_client', true);
    echo '<label for="wparticles_client_field">Имя клиента:</label>';
    echo '<input type="text" id="wparticles_client_field" name="wparticles_client_field" value="' . esc_attr($value) . '" size="25" />';
}

function wparticles_save_client_meta($post_id) {
    if (!isset($_POST['wparticles_client_meta_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['wparticles_client_meta_nonce'], 'wparticles_save_client_meta')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wparticles_client_field'])) {
        update_post_meta($post_id, '_wparticles_client', sanitize_text_field($_POST['wparticles_client_field']));
    }
}
add_action('save_post', 'wparticles_save_client_meta');

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

Итог

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

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

Как удалить загрузку WOFF шрифтов в WordPress для ускорения сайта
18.03.2026
Как удалить пустые мета данные в WordPress для оптимизации базы данных
09.02.2026
Как добавить локализацию в плагин WordPress
13.02.2026
Как сделать динамический список постов с пагинацией на AJAX в WordPress
05.04.2026
Как настроить автопостинг в WordPress из разных источников
17.02.2026

Ниже мы подобрали самые актуальные материалы по Вордпресс