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

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

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

Custom Post Type — это расширение стандартных типов контента WordPress, которое позволяет создавать свои уникальные сущности. Например, если вы ведёте сайт с обзорами книг, можно создать тип записи «Книга» с собственными полями, таксономиями и шаблонами отображения.

Преимущества использования CPT:

  • Структурирование контента по разным категориям;
  • Упрощение администрирования и поиска нужной информации;
  • Возможность создавать различные шаблоны отображения;
  • Более гибкая организация сайта без необходимости создавать отдельные сайты или использовать сложные плагины.

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

Для регистрации нового типа записи используется функция register_post_type(), которую нужно вызвать на хуке init. Рассмотрим пример создания типа записи «Книга».

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

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'books'),
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'show_in_rest' => true,
        'menu_position' => 5,
        'menu_icon' => 'dashicons-book',
    );

    register_post_type('book', $args);
}
add_action('init', 'wp2_create_book_cpt');

Данный код добавит в админ-панель новый раздел «Книги» с поддержкой редактора, миниатюр и метаполей.

Настройка таксономий для Custom Post Type

Для удобной организации контента рекомендуется создавать свои таксономии (категории, теги). Для CPT «Книга» можно добавить таксономию «Жанр».

function wp2_create_book_taxonomies() {
    $labels = array(
        'name' => 'Жанры',
        'singular_name' => 'Жанр',
        'search_items' => 'Искать жанры',
        'all_items' => 'Все жанры',
        'edit_item' => 'Редактировать жанр',
        'add_new_item' => 'Добавить новый жанр',
        'menu_name' => 'Жанры',
    );

    $args = array(
        'hierarchical' => true,
        'labels' => $labels,
        'show_ui' => true,
        'show_in_rest' => true,
        'rewrite' => array('slug' => 'genre'),
    );

    register_taxonomy('genre', array('book'), $args);
}
add_action('init', 'wp2_create_book_taxonomies');

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

Добавление пользовательских полей с помощью плагина Advanced Custom Fields

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

После установки плагина:

  1. Создайте группу полей, например «Данные книги».
  2. Добавьте поля: текстовое поле «Автор», число «Год издания» и рейтинг.
  3. Настройте правила показа — группа должна отображаться для типа записи «Книга».

В шаблоне для отображения книги выведете данные так:

<?php
$author = get_field('author');
$year = get_field('year');
$rating = get_field('rating');
echo '<p>Автор: '.esc_html($author).'</p>';
echo '<p>Год издания: '.intval($year).'</p>';
echo '<p>Рейтинг: '.floatval($rating).'</p>';
?>

Создание кастомных шаблонов для Custom Post Type

Чтобы отдельный тип записи отображался уникально, можно создать шаблон single-book.php в вашей теме. WordPress автоматически подхватит его для отображения записи типа «book».

Пример минимального файла single-book.php:

<?php
get_header();
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <h1><?php the_title(); ?></h1>
    <div class="content"><?php the_content(); ?></div>
    <?php
    echo '<p>Автор: '.esc_html(get_field('author')).'</p>';
    echo '<p>Год издания: '.intval(get_field('year')).'</p>';
    ?>
<?php endwhile; endif; get_footer(); ?>

Так вы сможете полностью контролировать вывод данных и стиль отображения.

Обработка запросов и фильтрация Custom Post Type в admin

Для удобства управления CPT в админке можно добавить фильтры по своим таксономиям или метаполям. Например, фильтр по жанру в списке книг.

Для этого воспользуемся хуками restrict_manage_posts и pre_get_posts. Пример кода:

function wp2_filter_books_by_genre() {
    global $typenow;
    if ($typenow == 'book') {
        $taxonomy = 'genre';
        $selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
        wp_dropdown_categories(array(
            'show_option_all' => 'Все жанры',
            'taxonomy' => $taxonomy,
            'name' => $taxonomy,
            'orderby' => 'name',
            'selected' => $selected,
            'hide_empty' => false,
        ));
    }
}
add_action('restrict_manage_posts', 'wp2_filter_books_by_genre');

function wp2_filter_books_query($query) {
    global $pagenow;
    $type = isset($_GET['post_type']) ? $_GET['post_type'] : '';
    if ($pagenow == 'edit.php' && $type == 'book' && isset($_GET['genre']) && is_numeric($_GET['genre'])) {
        $term = intval($_GET['genre']);
        $query->query_vars['tax_query'] = array(
            array(
                'taxonomy' => 'genre',
                'field' => 'term_id',
                'terms' => $term,
            )
        );
    }
}
add_filter('pre_get_posts', 'wp2_filter_books_query');

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

Если вы не хотите писать код, на 2wp.ru и в репозитории WordPress есть хорошие плагины для создания CPT:

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

Используйте эти плагины, если нужно быстро организовать структуру сайта, не углубляясь в программирование.

Советы по оптимизации и безопасности при работе с CPT

При создании собственных типов записей важно учесть производительность и безопасность:

  • Регистрируйте CPT и таксономии с правильными параметрами, избегайте лишних возможностей, если они не нужны.
  • Используйте show_in_rest для поддержки Gutenberg и REST API, если планируете работу с блоками и внешними приложениями.
  • При выводе пользовательских данных применяйте функции экранирования esc_html(), esc_attr() и т.п.
  • Если добавляете метаполя вручную, используйте nonce и проверки прав для сохранения безопасности.
  • Оптимизируйте запросы с помощью правильных индексов в базе и кеширования.

Соблюдение этих рекомендаций поможет избежать проблем и обеспечит стабильную работу сайта.

Автоматическое переключение языка в WordPress по геолокации
07.01.2026
Удаление неиспользуемых таблиц из базы данных WordPress для оптимизации сайта
11.01.2026
Автоматическое удаление спам-комментариев в WordPress
26.01.2026
Автоматическое отключение пингов и пингбэков в WordPress
31.12.2025
Как создать кастомную страницу входа в WordPress и решить проблемы с безопасностью
17.12.2025