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

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

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

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

Например, если у вас сайт с отзывами, то логично создать тип записей review, отдельно от обычных постов. Или для каталога товаров — тип product.

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

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

Основной способ — использовать функцию register_post_type(). Лучше всего регистрировать тип записей в хукe init. Рассмотрим пример для типа portfolio — портфолио.

function wpstock_register_portfolio_cpt() {
    $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' => 'portfolio'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 20,
        'menu_icon'          => 'dashicons-portfolio',
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt'),
    );

    register_post_type('portfolio', $args);
}
add_action('init', 'wpstock_register_portfolio_cpt');

В этом коде:

  • $labels — подписи для админки;
  • public — тип будет публичным и доступным в фронтенде;
  • supports — какие стандартные поля будут поддерживаться (заголовок, редактор, миниатюра и т.д.);
  • menu_icon — иконка в меню админки;
  • rewrite — правила формирования URL.

Советы по настройке параметров

Если тип записей нужен только для админки, установите 'public' => false и 'show_ui' => true. Для SEO и отображения на сайте важно иметь 'public' => true и корректные правила rewrite.

Параметр 'has_archive' позволяет иметь архивную страницу, например, site.ru/portfolio/, выводящую все записи этого типа.

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

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

Пример добавления мета-поля "URL проекта"

Добавим поле в редактор записи портфолио с помощью метабокса.

function wpstock_add_portfolio_metabox() {
    add_meta_box(
        'wpstock_portfolio_url',
        'URL проекта',
        'wpstock_portfolio_url_callback',
        'portfolio',
        'normal',
        'default'
    );
}
add_action('add_meta_boxes', 'wpstock_add_portfolio_metabox');

function wpstock_portfolio_url_callback($post) {
    wp_nonce_field('wpstock_save_portfolio_url', 'wpstock_portfolio_url_nonce');
    $value = get_post_meta($post->ID, '_wpstock_portfolio_url', true);
    echo '<label for="wpstock_portfolio_url_field">Ссылка на проект: </label>';
    echo '<input type="url" id="wpstock_portfolio_url_field" name="wpstock_portfolio_url_field" value="' . esc_attr($value) . '" size="25" />';
}

function wpstock_save_portfolio_url($post_id) {
    if (!isset($_POST['wpstock_portfolio_url_nonce']) || !wp_verify_nonce($_POST['wpstock_portfolio_url_nonce'], 'wpstock_save_portfolio_url')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wpstock_portfolio_url_field'])) {
        $url = sanitize_text_field($_POST['wpstock_portfolio_url_field']);
        update_post_meta($post_id, '_wpstock_portfolio_url', $url);
    }
}
add_action('save_post', 'wpstock_save_portfolio_url');

Этот код:

  • Добавляет метабокс с полем URL;
  • Сохраняет данные при сохранении записи;
  • Использует nonce для безопасности.

Отображение кастомного типа записей на фронтенде

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

Пример WP_Query для вывода 5 проектов

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

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

Подключение таксономий к Custom Post Type

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

Пример регистрации таксономии "Тип проекта" для портфолио

function wpstock_register_portfolio_taxonomy() {
    $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('project_type', array('portfolio'), $args);
}
add_action('init', 'wpstock_register_portfolio_taxonomy');

Теперь в редакторе портфолио появится возможность назначать типы проектов, а на фронтенде можно фильтровать записи по таксономии.

Полезные плагины для работы с Custom Post Type

Хотя регистрация CPT в коде даёт максимум контроля, иногда удобнее использовать плагины:

  • Custom Post Type UI — простой интерфейс для создания CPT и таксономий без кода.
  • Meta Box — мощный плагин для создания мета-полей и метабоксов.
  • Advanced Custom Fields Pro — удобный способ добавлять и выводить кастомные поля.

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

Как использовать хук WooCommerce before_add_to_cart для дополнительных проверок
03.06.2026
Как удалить или исключить страницы WooCommerce из поисковых систем
03.07.2026
Автоматическое удаление завершённых заказов в WooCommerce: практическое руководство
08.05.2026
Как создать адаптивный слайдер в WordPress с помощью плагинов и кода
27.12.2025
Как добавить собственные настройки в админ-панель WordPress
02.12.2025