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

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

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

Custom Post Type — это специальный тип контента, который вы можете добавить в админ-панель WordPress, помимо стандартных записей и страниц. CPT позволяет структурировать данные, разделить разные виды контента и упростить их управление.

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

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

Регистрация собственного типа записи в WordPress

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

Пример кода регистрации CPT

function wp_pro_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,
        'menu_icon'          => 'dashicons-portfolio',
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields')
    );

    register_post_type('wp_pro_project', $args);
}
add_action('init', 'wp_pro_register_custom_post_type');

В этом примере тип записи называется wp_pro_project. Важно использовать префикс (здесь wp_pro_), чтобы избежать конфликтов с другими плагинами и темами.

Подробный разбор параметров register_post_type

Рассмотрим ключевые параметры массива $args:

  • labels — массив названий для админки. Желательно заполнить все, чтобы интерфейс был понятным.
  • public — делает CPT видимым на сайте и в админке.
  • publicly_queryable — позволяет делать запросы с фронтенда (например, через URL).
  • show_ui — отображать ли интерфейс в админке.
  • show_in_menu — показывать ли в меню админки.
  • query_var — включить возможность использовать запросы с параметром типа записи.
  • rewrite — настройки ЧПУ (pretty permalinks). Здесь мы задаём свой слаг.
  • capability_type — права доступа, обычно 'post' или 'page'.
  • has_archive — включить ли архивную страницу с архивом всех записей CPT.
  • hierarchical — позволяет ли создавать иерархию (как страницы с подстраницами). Обычно false для записей.
  • menu_position — позиция в меню админки.
  • menu_icon — иконка в меню, можно взять из Dashicons.
  • supports — массив поддерживаемых стандартных возможностей: заголовок, редактор, миниатюры, произвольные поля и т. д.

Добавление пользовательских таксономий для CPT

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

Пример регистрации таксономии

function wp_pro_register_custom_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('wp_pro_project_type', array('wp_pro_project'), $args);
}
add_action('init', 'wp_pro_register_custom_taxonomy');

В этом примере создаётся иерархическая таксономия «Типы проектов», связанная с CPT «Проекты».

Вывод записей собственного типа на сайте

Чтобы вывести записи CPT на сайте, можно использовать стандартный класс WP_Query. Например, вывести последние 5 проектов:

$args = array(
    'post_type'      => 'wp_pro_project',
    'posts_per_page' => 5,
);
$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 'Проекты не найдены';
}

Такой код можно использовать в шаблонах темы, чтобы выводить нужный контент.

Кастомизация шаблонов для Custom Post Type

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

  • single-{post_type}.php — шаблон отдельной записи CPT.
  • archive-{post_type}.php — шаблон архива CPT.

Если таких файлов нет, WordPress использует стандартные single.php и archive.php.

Например, создайте файл single-wp_pro_project.php в вашей теме и оформите вывод так, как нужно для проектов. Это позволит вывести уникальный дизайн и дополнительные поля.

Добавление метаполей (custom fields) к CPT с помощью плагина Advanced Custom Fields (ACF)

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

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

echo esc_html(get_field('project_start_date'));

Это значительно расширит возможности кастомизации контента без написания большого количества кода.

Автоматизация создания CPT с помощью плагина Custom Post Type UI

Если вы не хотите писать код вручную, можно воспользоваться бесплатным плагином Custom Post Type UI. Он позволяет через удобный интерфейс создавать и настраивать типы записей и таксономии.

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

Советы по работе с Custom Post Types

  • Используйте префиксы в названиях CPT и функций, чтобы избежать конфликтов с другими плагинами.
  • Пишите читаемые и полные метки (labels) для удобства пользователей в админке.
  • Обязательно регистрируйте CPT и таксономии в хуке init.
  • Создавайте отдельные шаблоны для CPT, чтобы уникализировать внешний вид.
  • Используйте ACF для расширения метаданных записи без сложного кода.
  • Тестируйте ЧПУ (permalinks) после регистрации CPT, иногда надо сохранить настройки ссылок в админке.
  • Для вывода записей CPT используйте WP_Query с параметром post_type.

Пример функции wp_pro_get_recent_projects для вывода последних проектов

function wp_pro_get_recent_projects($count = 5) {
    $args = array(
        'post_type'      => 'wp_pro_project',
        'posts_per_page' => $count,
    );
    $query = new WP_Query($args);
    $output = '<ul>';
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        wp_reset_postdata();
    } else {
        $output .= '<li>Проекты не найдены</li>';
    }
    $output .= '</ul>';
    return $output;
}

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

Как автоматизировать создание резервной копии WordPress
03.12.2025
WooCommerce не показывает товары после обновления: как исправить
20.04.2026
Как добавить автоподсказку в поиск WordPress
21.03.2026
Автоматическое удаление спама в комментариях WordPress
19.01.2026
Как использовать выборку данных в WordPress с помощью WP_Query
21.11.2025