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

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

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

Custom Post Type — это пользовательский тип контента, который позволяет структурировать и организовывать информацию на сайте более гибко. Например, если вы создаёте сайт портфолио, можно завести CPT «Проекты», чтобы отделить их от обычных записей блога. Аналогично, для сайта с мероприятиями можно создать CPT «События».

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

Важно понимать, что CPT — это не просто таксономия или метаполя, а полноценный тип записи, который можно регистрировать, редактировать и выводить.

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

Для создания CPT используется функция register_post_type(), которую необходимо вызывать в хук init. Хорошей практикой является оформление регистрации CPT в отдельной функции с префиксом домена, например, wpfactory_register_custom_post_type().

Рассмотрим базовый пример создания CPT «Проекты».

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

    register_post_type('project', $args);
}
add_action('init', 'wpfactory_register_custom_post_type');

В этом примере мы создали CPT с названием project, который поддерживает заголовок, редактор, миниатюру, краткое описание и комментарии. Благодаря параметру has_archive для CPT автоматически создаётся архивная страница по адресу /projects/.

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

  • labels — массив с названиями для разных частей интерфейса администратора;
  • public — отображать ли записи CPT публично на сайте;
  • rewrite — правила преобразования URL, в нашем случае slug будет projects;
  • supports — набор функционала, который будет доступен для CPT (заголовок, редактор, миниатюры и т.д.);
  • has_archive — включение архивной страницы для CPT.

Добавление таксономий к кастомному типу записей

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

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

function wpfactory_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('project_type', array('project'), $args);
}
add_action('init', 'wpfactory_register_project_taxonomy');

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

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

Для вывода записей CPT в шаблонах WordPress можно использовать WP_Query с указанием параметра post_type.

Пример вывода последних 5 проектов:

$args = array(
    'post_type' => 'project',
    'posts_per_page' => 5,
);
$project_query = new WP_Query($args);

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

Такой код можно поместить в любой шаблон темы, например, в page-projects.php или в виджет.

Создание шаблонов для CPT

Для улучшения отображения CPT можно создать отдельные шаблоны:

  • single-project.php — шаблон для одиночной записи типа «Проект»;
  • archive-project.php — шаблон для архивной страницы всех проектов.

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

Советы и рекомендации по работе с Custom Post Types

При создании CPT важно:

  • Выбирать уникальные имена (с префиксом, если необходимо) для CPT и таксономий, чтобы избежать конфликтов с плагинами и темами.
  • Использовать правильные параметры, учитывая требования проекта, например, если нужно вести иерархию, ставьте hierarchical => true.
  • Регистрация CPT должна происходить на хуке init, чтобы они были доступны вовремя.
  • Не забывайте очищать правила перезаписи (перейдите в Настройки → Постоянные ссылки и нажмите «Сохранить»), чтобы новые URL работали корректно.

Расширение функционала CPT через плагины

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

  • Custom Post Type UI — удобный интерфейс для регистрации CPT и таксономий без кода;
  • Advanced Custom Fields (ACF) — для добавления метаполей и расширенного управления полями CPT;
  • Pods — комплексное решение для создания CPT, таксономий и пользовательских полей.

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

Как создать автоматическую резервную копию WordPress с помощью WPRemark
20.02.2026
Как добавить автоматическое обновление тем в WordPress
14.04.2026
Как использовать хуки в WordPress: практическое руководство
19.11.2025
Как создать автоматический импорт продуктов в WooCommerce
10.03.2026
Как вывести и использовать метаданные товара WooCommerce в шаблонах
03.05.2026