Как добавить Custom Post Type в WordPress: подробное руководство с примерами

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

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

WordPress изначально работает с двумя типами контента: записи (posts) и страницы (pages). Однако в реальных проектах часто требуется более гибкая организация контента. Например, для портфолио, каталогов, отзывов, мероприятий и т.д. Здесь на помощь приходит Custom Post Type — пользовательский тип записи.

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

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

Регистрация Custom Post Type — базовый код и параметры

Для регистрации CPT в WordPress используется функция register_post_type(). Ее обычно вызывают в хуке init. Давайте рассмотрим простой пример для создания типа записей «Проекты».

function wpbono_register_projects_cpt() {
    $labels = array(
        'name'               => 'Проекты',
        'singular_name'      => 'Проект',
        'menu_name'          => 'Проекты',
        'name_admin_bar'     => 'Проект',
        'add_new'            => 'Добавить проект',
        'add_new_item'       => 'Добавить новый проект',
        'edit_item'          => 'Редактировать проект',
        'new_item'           => 'Новый проект',
        'view_item'          => 'Просмотреть проект',
        'all_items'          => 'Все проекты',
        'search_items'       => 'Поиск проектов',
        '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'),
    );

    register_post_type('wpbono_project', $args);
}
add_action('init', 'wpbono_register_projects_cpt');

В этом коде мы определили название типа, метки для интерфейса, необходимые параметры (поддержка миниатюр, редактора и т.д.), а также задали слаг для ЧПУ и сделали тип публичным.

Обратите внимание, что префикс wpbono_ добавлен к названию типа, чтобы избежать конфликтов с другими плагинами и темами.

Разбор ключевых параметров register_post_type()

  • labels — массив с текстами для разных частей админки, чтобы интерфейс был понятен пользователю.
  • public — определяет, будет ли тип виден на сайте и в админке.
  • has_archive — позволяет иметь архивную страницу с перечислением всех записей типа.
  • supports — указывает, какие элементы редактора и метаданных будут доступны (например, заголовок, редактор, миниатюры).
  • rewrite — параметры ЧПУ, чтобы задавать красивый URL.
  • menu_position — позиция пункта меню в админке, чтобы удобно размещать.

Добавление кастомных таксономий для Custom Post Type

Часто для Custom Post Type нужны собственные категории или метки. Для этого WordPress позволяет создавать кастомные таксономии с помощью функции register_taxonomy(). Рассмотрим пример добавления таксономии «Тип проекта» для нашего CPT.

function wpbono_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'),
    );

    register_taxonomy('wpbono_project_type', array('wpbono_project'), $args);
}
add_action('init', 'wpbono_register_project_taxonomy');

Теперь у нашего типа «Проекты» появится новая таксономия, которая позволит структурировать проекты по типам, например «Веб-сайт», «Мобильное приложение», «Дизайн» и т.д.

Вывод Custom Post Type на сайте — примеры шаблонов и WP_Query

Чтобы вывести записи нового типа на сайте, можно создать отдельный шаблон архива: archive-wpbono_project.php или использовать WP_Query в любом месте темы.

Пример базового цикла для вывода проектов:

$args = array(
    'post_type' => 'wpbono_project',
    'posts_per_page' => 10,
);
$query = new WP_Query($args);

if ($query->have_posts()) {
    echo '<ul>';
    while ($query->have_posts()) {
        $query->the_post();
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo 'Проекты не найдены.';
}

Вы можете добавить этот код в шаблон страницы или виджет для отображения списка проектов. При желании оформите вывод по-своему, добавьте миниатюры, отрывки и т.д.

Создание кастомного шаблона записи CPT

Для отображения одиночной записи типа «Проект» создайте файл single-wpbono_project.php в папке темы. В нем можно вывести специфический для проекта контент, метаданные, таксономии и прочее.

Например, базовый шаблон может содержать:

<?php get_header(); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <h1><?php the_title(); ?></h1>
    <div class="project-content"><?php the_content(); ?></div>
    <div class="project-type">Тип: <?php echo get_the_term_list(get_the_ID(), 'wpbono_project_type', '', ', '); ?></div>
<?php endwhile; endif; ?>

<?php get_footer(); ?>

Советы по безопасности и производительности при работе с CPT

При разработке CPT важно учитывать несколько моментов, чтобы не навредить сайту и обеспечить удобство:

  • Используйте префиксы в названиях функций и типов, чтобы избежать конфликтов.
  • Определяйте только необходимые поддержки — не добавляйте лишние опции, чтобы не нагружать базу.
  • Кэшируйте запросы, если используете WP_Query для вывода большого объема данных.
  • Не забывайте про права доступа — если CPT требует особых ролей, настраивайте capability_type и map_meta_cap.
  • Тестируйте на разных конфигурациях, чтобы избежать ошибок при обновлениях WordPress и плагинов.

Заключение

Custom Post Type — это ключевой инструмент для гибкой настройки сайта на WordPress. С его помощью вы сможете создать удобную структуру контента, которая идеально подойдет под задачи вашего проекта. В статье мы рассмотрели, как правильно регистрировать CPT, добавлять таксономии, выводить записи и создавать шаблоны. Используйте предоставленные примеры кода с префиксом wpbono_ для надежности и удобства в дальнейшем развитии вашего сайта.

Как создать нетипичный файловый хендлер в WordPress для обработки нестандартных типов файлов
24.03.2026
WooCommerce: как исключить определённые товары из автоматических скидок
30.05.2026
Автоматизированный импорт продуктов в WordPress: практическое руководство с WPBono
16.03.2026
Как отладить проблемы с кэшированием в WordPress
01.12.2025
WooCommerce: как исключить определённые товары из отложенных заказов
10.05.2026