Как создать персонализированные типы записей в WordPress: практические примеры и код

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

Что такое персонализированные типы записей в WordPress и зачем они нужны

Стандартно WordPress предлагает несколько типов записей: post (записи блога), page (страницы), и некоторые другие, например, вложения (attachments). Но часто нужно структурировать контент иначе — например, создать каталог товаров, портфолио, отзывы или события. Для этого используются пользовательские типы записей.

Пользовательские типы позволяют:

  • Создавать отдельные разделы сайта с собственной логикой;
  • Добавлять уникальные метаданные и таксономии именно для этого типа;
  • Управлять отображением и поведением записи через шаблоны;
  • Упростить работу редакторов, отделив разные виды контента.

Создание CPT — один из краеугольных камней разработки сложных сайтов на WordPress.

Регистрация пользовательского типа записи через functions.php

Самый распространённый способ — добавить код в файл functions.php вашей темы или в отдельный плагин. Рассмотрим пример создания CPT для портфолио.

function wptem_register_portfolio_cpt() {
    $labels = array(
        'name' => 'Портфолио',
        'singular_name' => 'Работа',
        'add_new' => 'Добавить работу',
        'add_new_item' => 'Добавить новую работу',
        'edit_item' => 'Редактировать работу',
        'new_item' => 'Новая работа',
        'view_item' => 'Просмотреть работу',
        'search_items' => 'Искать работы',
        'not_found' => 'Работы не найдены',
        'not_found_in_trash' => 'Нет работ в корзине',
        'menu_name' => 'Портфолио',
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'portfolio'),
        'show_in_rest' => true, // поддержка Gutenberg
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'menu_position' => 5,
        'menu_icon' => 'dashicons-portfolio',
    );

    register_post_type('wptem_portfolio', $args);
}
add_action('init', 'wptem_register_portfolio_cpt');

В этом коде мы задаём метки и параметры CPT. Обратите внимание на префикс wptem_ для названия типа записи и функции — это хорошая практика для избежания конфликтов.

Пояснения к параметрам

  • public — делает тип записи доступным для отображения и редактирования;
  • has_archive — включает архивную страницу с перечнем всех записей типа;
  • rewrite — настраивает ЧПУ, в нашем случае /portfolio/;
  • show_in_rest — поддержка редактора Gutenberg и REST API;
  • supports — список поддерживаемых функций редактора;
  • menu_icon — иконка в админ-панели.

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

Часто нужно не только создать тип записи, но и организовать для него категории и метки. Для этого регистрируем пользовательские таксономии. Например, для портфолио — категории проектов и теги технологий.

function wptem_register_portfolio_taxonomies() {
    // Категории портфолио
    $labels_cat = array(
        'name' => 'Категории портфолио',
        'singular_name' => 'Категория портфолио',
        'search_items' => 'Искать категории',
        'all_items' => 'Все категории',
        'edit_item' => 'Редактировать категорию',
        'update_item' => 'Обновить категорию',
        'add_new_item' => 'Добавить новую категорию',
        'new_item_name' => 'Название новой категории',
        'menu_name' => 'Категории портфолио',
    );

    $args_cat = array(
        'hierarchical' => true, // как категории
        'labels' => $labels_cat,
        'show_ui' => true,
        'show_in_rest' => true,
        'rewrite' => array('slug' => 'portfolio-category'),
    );

    register_taxonomy('wptem_portfolio_category', array('wptem_portfolio'), $args_cat);

    // Теги портфолио
    $labels_tag = array(
        'name' => 'Теги портфолио',
        'singular_name' => 'Тег портфолио',
        'search_items' => 'Искать теги',
        'all_items' => 'Все теги',
        'edit_item' => 'Редактировать тег',
        'update_item' => 'Обновить тег',
        'add_new_item' => 'Добавить новый тег',
        'new_item_name' => 'Название нового тега',
        'menu_name' => 'Теги портфолио',
    );

    $args_tag = array(
        'hierarchical' => false, // как метки
        'labels' => $labels_tag,
        'show_ui' => true,
        'show_in_rest' => true,
        'rewrite' => array('slug' => 'portfolio-tag'),
    );

    register_taxonomy('wptem_portfolio_tag', array('wptem_portfolio'), $args_tag);
}
add_action('init', 'wptem_register_portfolio_taxonomies');

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

Использование плагинов для создания CPT

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

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

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

Вывод записей пользовательского типа на сайте — шаблоны и циклы

После регистрации CPT нужно вывести их на фронтенде. WordPress автоматически ищет шаблоны в теме по названию типа записи:

  • single-wptem_portfolio.php — для одиночной записи;
  • archive-wptem_portfolio.php — для архива типа записи.

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

Пример простого цикла вывода записей портфолио в архиве:

if (have_posts()) {
    while (have_posts()) {
        the_post();
        echo '<h2>' . get_the_title() . '</h2>';
        the_excerpt();
        if (has_post_thumbnail()) {
            the_post_thumbnail('medium');
        }
        echo '<a href="' . get_permalink() . '">Подробнее</a>';
    }
} else {
    echo '<p>Работы не найдены.</p>';
}

Кастомный WP_Query для выборки CPT

Для вывода CPT в любом месте сайта можно использовать WP_Query:

$args = array(
    'post_type' => 'wptem_portfolio',
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        echo '<h3>' . get_the_title() . '</h3>';
        the_excerpt();
    }
    wp_reset_postdata();
} else {
    echo '<p>Портфолио пусто.</p>';
}

Резюме и советы для разработки CPT

Создание персонализированных типов записей — мощный инструмент для построения любого сайта на WordPress. Главное — придерживаться следующих рекомендаций:

  • Используйте префиксы для функций и названий CPT, чтобы избежать конфликтов.
  • Регистрируйте CPT и таксономии в хуке init.
  • Не забывайте про поддержку REST API, если используете Gutenberg или планируете интеграции.
  • Создавайте отдельные шаблоны для CPT, чтобы легко контролировать вывод.
  • Используйте кастомные поля и метаданные для расширения функционала.

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

WooCommerce: автоматическое удаление неактивных корзин и заказов
29.04.2026
Как сделать динамические таблицы в WordPress без плагинов
09.03.2026
Автоматическая отмена неоплаченных заказов в WooCommerce
14.06.2026
WooCommerce: автоматическое удаление товаров без заказов через заданный период
26.04.2026
Как создать многоязычный сайт на WordPress
21.11.2025