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

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

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

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

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

Регистрация Custom Post Type через functions.php

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

function wpmentor_register_custom_post_type_projects() {
    $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'       => 'Искать проекты',
        '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,
        'menu_icon'          => 'dashicons-portfolio',
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
    );

    register_post_type('wpmentor_projects', $args);
}
add_action('init', 'wpmentor_register_custom_post_type_projects');

Обратите внимание, что функция названа с префиксом wpmentor_ для избежания конфликтов. В параметре 'supports' перечислены возможности, которые будут доступны для этого типа записей — заголовок, редактор, миниатюры и т. д.

Объяснение параметров register_post_type

labels — массив с названиями и текстами интерфейса в админке.
public — разрешает использование CPT на фронтенде.
rewrite — задает ЧПУ для типа записей.
has_archive — включает архивную страницу для всех записей данного типа.
supports — определяет доступные метабоксы и функции для записи.

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

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

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

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

Добавление таксономий и метаполей к Custom Post Type

Часто для CPT нужны собственные категории и метаданные. Например, для «Проектов» можно добавить таксономию «Тип проекта» и кастомное поле «Дата начала».

Регистрация таксономии с помощью кода

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

Добавление пользовательского поля (метаполя)

Для добавления кастомных полей можно использовать плагины, например Advanced Custom Fields (ACF), либо реализовать вручную:

function wpmentor_add_custom_meta_box() {
    add_meta_box(
        'wpmentor_project_date',
        'Дата начала проекта',
        'wpmentor_project_date_callback',
        'wpmentor_projects',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpmentor_add_custom_meta_box');

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

function wpmentor_save_project_date_meta($post_id) {
    if (array_key_exists('wpmentor_project_date_field', $_POST)) {
        update_post_meta(
            $post_id,
            '_wpmentor_project_date',
            $_POST['wpmentor_project_date_field']
        );
    }
}
add_action('save_post', 'wpmentor_save_project_date_meta');

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

Вывод Custom Post Type на сайте и создание шаблонов

Чтобы отображать записи вашего CPT на сайте, можно создать шаблоны в теме. Для архива создайте файл archive-wpmentor_projects.php, а для одиночного просмотра — single-wpmentor_projects.php. В них можно настроить вывод так, как нужно.

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

<?php
$args = array(
    'post_type' => 'wpmentor_projects',
    'posts_per_page' => 10,
);
$projects = new WP_Query($args);

if ($projects->have_posts()) :
    while ($projects->have_posts()) : $projects->the_post(); ?>
        <h2><?php the_title(); ?></h2>
        <div><?php the_excerpt(); ?></div>
    <?php endwhile;
    wp_reset_postdata();
else :
    echo '<p>Проекты не найдены.</p>';
endif;
?>

Советы по оптимизации и безопасности Custom Post Type

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

Рекомендуется использовать префиксы в названиях функций и метаданных. Также не забывайте про права доступа — если для вашего CPT нужен ограниченный доступ, настраивайте параметры capability_type и capabilities.

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

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

Как создать и использовать shortcode в WordPress
30.11.2025
Как автоматизировать сбор и отправку отзывов в WordPress
08.03.2026
Автоматическое удаление неактивных пользователей в WordPress
24.02.2026
WooCommerce: как добавить автоматическое изменение цены товара при использовании промокода
10.05.2026
Как создать динамические таблицы в WordPress с помощью shortcode
10.12.2025