Как автоматизировать создание кастомных типов постов в WordPress

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

Что такое кастомные типы постов и зачем их автоматизировать

Кастомный тип поста — это способ организовать контент по отдельной логике, не смешивая его с обычными записями блога. Например, для сайта кинотеатра это могут быть фильмы, для сайта агентства — кейсы, для магазина — товары.

Ручное создание CPT в коде через register_post_type() требует понимания структуры и может быть трудоемким при большом количестве или частых изменениях. Автоматизация значительно упрощает этот процесс, позволяет создавать, редактировать и управлять CPT через админку или с помощью плагинов.

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

Плагины для удобного создания кастомных типов постов

Advanced Custom Fields (ACF) и CPT UI — популярный дуэт

Плагин CPT UI позволяет создавать кастомные типы постов и таксономии через удобный интерфейс без кода. Он не отвечает за поля, но отлично справляется с регистрацией CPT.

ACF дополняет CPT UI, позволяя легко создавать и управлять пользовательскими полями для ваших типов постов.

Преимущества подхода:

  • Не нужно писать код;
  • Все изменения делаются через админку;
  • Поддержка экспорта настроек в PHP для контроля версий.

Недостатки — зависимость от плагинов и возможное замедление сайта, если плагинов много.

Пример создания CPT через CPT UI

После установки и активации CPT UI перейдите в меню «Add/Edit Post Types» и заполните поля:

  • Post Type Slug: movie
  • Plural Label: Movies
  • Singular Label: Movie
  • Остальные настройки оставьте по умолчанию или настройте под свои нужды.

Нажмите «Add Post Type» — CPT появится в меню WordPress.

Автоматизация через код: создание функции для регистрации CPT

Если нужна максимальная гибкость и минимальная зависимость от плагинов, лучше автоматизировать регистрацию CPT программно. Создадим функцию с префиксом wptavern_ для удобства и предотвращения конфликтов.

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

function wptavern_register_cpt_movie() {
    $labels = array(
        'name' => 'Movies',
        'singular_name' => 'Movie',
        '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' => 'movies'),
        'supports' => array('title', 'editor', 'thumbnail', 'comments'),
        'show_in_rest' => true,
    );

    register_post_type('movie', $args);
}
add_action('init', 'wptavern_register_cpt_movie');

Данный код регистрирует новый тип поста с названием "movie", который поддерживает заголовок, редактор, миниатюру и комментарии. Также он включен в REST API для совместимости с Gutenberg и внешними приложениями.

Автоматизация регистрации нескольких CPT через массив

Для удобства можно создать массив с описанием нескольких типов и зарегистрировать их циклом. Это упростит добавление новых CPT в будущем.

function wptavern_register_custom_post_types() {
    $post_types = array(
        'movie' => array(
            'singular' => 'Movie',
            'plural' => 'Movies',
            'slug' => 'movies',
            'supports' => array('title', 'editor', 'thumbnail')
        ),
        'book' => array(
            'singular' => 'Book',
            'plural' => 'Books',
            'slug' => 'books',
            'supports' => array('title', 'editor', 'comments')
        )
    );

    foreach ($post_types as $type => $data) {
        $labels = array(
            'name' => $data['plural'],
            'singular_name' => $data['singular'],
            'add_new' => 'Добавить новый',
            'add_new_item' => 'Добавить новый ' . strtolower($data['singular']),
            'edit_item' => 'Редактировать ' . strtolower($data['singular']),
            'new_item' => 'Новый ' . strtolower($data['singular']),
            'view_item' => 'Просмотреть ' . strtolower($data['singular']),
            'search_items' => 'Поиск ' . strtolower($data['plural']),
            'not_found' => $data['plural'] . ' не найдены',
            'not_found_in_trash' => 'В корзине ' . strtolower($data['plural']) . ' не найдено',
            'menu_name' => $data['plural']
        );

        $args = array(
            'labels' => $labels,
            'public' => true,
            'has_archive' => true,
            'rewrite' => array('slug' => $data['slug']),
            'supports' => $data['supports'],
            'show_in_rest' => true,
        );

        register_post_type($type, $args);
    }
}
add_action('init', 'wptavern_register_custom_post_types');

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

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

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

Автоматизируем регистрацию таксономии с префиксом wptavern_:

function wptavern_register_taxonomy_genre() {
    $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_in_rest' => true,
        'rewrite' => array('slug' => 'genre')
    );

    register_taxonomy('genre', array('movie'), $args);
}
add_action('init', 'wptavern_register_taxonomy_genre');

Здесь мы создали таксономию "genre", которая привязана к CPT "movie" и доступна в REST API.

Автоматическое добавление мета-полей для CPT через ACF или код

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

Использование ACF для добавления мета-полей

Создайте группу полей в ACF, выберите тип записи "movie" и добавьте нужные поля (например, "release_date" — дата выхода, "rating" — рейтинг).

Для вывода в шаблоне используйте:

echo get_field('release_date');
echo get_field('rating');

Добавление мета-полей вручную через код

Пример регистрации мета-поля "release_date" с префиксом wptavern_:

function wptavern_register_meta_fields() {
    register_post_meta('movie', 'wptavern_release_date', array(
        'show_in_rest' => true,
        'single' => true,
        'type' => 'string',
        'description' => 'Дата выхода фильма',
        'auth_callback' => function() {
            return current_user_can('edit_posts');
        },
    ));
}
add_action('init', 'wptavern_register_meta_fields');

Теперь мета-поле доступно через REST API и можно использовать в редакторах или при сохранении через код.

Пример вывода кастомного типа поста и мета-полей в шаблоне

Для вывода списка фильмов с дополнительными данными используем WP_Query:

$args = array(
    'post_type' => 'movie',
    'posts_per_page' => 10
);
$query = new WP_Query($args);

if ($query->have_posts()) {
    echo '<ul>';
    while ($query->have_posts()) {
        $query->the_post();
        $release_date = get_post_meta(get_the_ID(), 'wptavern_release_date', true);
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> - Выход: ' . esc_html($release_date) . '</li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo 'Фильмы не найдены';
}

Этот пример демонстрирует базовое использование WP_Query для вывода кастомного контента с мета-полями.

Советы по автоматизации и поддержке кастомных типов постов

  • Используйте префиксы для функций и мета-полей, чтобы избежать конфликтов. В нашем случае — wptavern_.
  • Сохраняйте регистрацию CPT и таксономий в отдельном файле, подключаемом через functions.php.
  • Экспортируйте настройки плагинов CPT UI и ACF в PHP для контроля версий и развертывания на других сайтах.
  • Не забывайте о поддержке REST API, если планируете использовать Gutenberg или внешние приложения.
  • Тестируйте изменения на локальной копии, чтобы не сломать рабочий сайт.
Как создать собственный виджет в WordPress
17.11.2025
Как использовать REST API для создания кастомных эндпоинтов в WordPress
09.12.2025
Как создать динамическую пагинацию в WordPress без плагинов
29.01.2026
Обновление WordPress без перерыва в работе сайта
05.01.2026
Как использовать внутренний кеш в WordPress для ускорения загрузки страниц
09.01.2026