Создание и использование Custom Post Types в WordPress

Что такое Custom Post Types в WordPress и зачем они нужны

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

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

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

Как зарегистрировать Custom Post Type в WordPress

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

function wpfinder_register_cpt_movie() {
    $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,
        'has_archive'        => true,
        'rewrite'            => array('slug' => 'movies'),
        'supports'           => array('title', 'editor', 'thumbnail', 'custom-fields'),
        'show_in_rest'       => true, // для поддержки Gutenberg
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-video-alt2',
    );

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

В этом коде мы определяем метки для админки, задаём основные параметры, включая поддержку миниатюр и кастомных полей, а также делаем CPT публичным и доступным для REST API.

Настройка пользовательских таксономий для Custom Post Types

Для удобной категоризации и фильтрации контента Custom Post Types часто дополняются пользовательскими таксономиями (например, жанры, режиссёры для фильмов). Создадим таксономию genre для нашего CPT movie.

function wpfinder_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_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'genre'),
        'show_in_rest'      => true,
    );

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

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

Вывод Custom Post Types и таксономий на сайте: примеры и шаблоны

Для отображения списка фильмов с фильтрацией по жанру можно создать новый файл шаблона archive-movie.php в вашей теме. Пример простого цикла вывода:

<?php get_header(); ?>

<h1>Фильмы</h1>

<?php if ( have_posts() ) : ?>
    <ul>
    <?php while ( have_posts() ) : the_post(); ?>
        <li>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            <p><?php echo get_the_term_list( get_the_ID(), 'genre', 'Жанр: ', ', ' ); ?></p>
        </li>
    <?php endwhile; ?>
    </ul>
<?php else : ?>
    <p>Фильмы не найдены.</p>
<?php endif; ?>

<?php get_footer(); ?>

Этот код выведет список всех фильмов с ссылками и жанрами. Чтобы отображать отдельные фильмы, можно создать single-movie.php с разметкой подробного просмотра.

Работа с мета-полями Custom Post Types: добавление и сохранение данных

Часто необходимо добавлять кастомные поля, например, дату выхода фильма или рейтинг. Можно использовать готовые плагины, например Advanced Custom Fields, но для понимания разберём, как добавить мета-поле вручную.

Добавим поле "Дата выхода" на страницу редактирования фильма.

function wpfinder_add_movie_metabox() {
    add_meta_box(
        'wpfinder_movie_release_date',
        'Дата выхода',
        'wpfinder_movie_release_date_callback',
        'movie',
        'side'
    );
}
add_action('add_meta_boxes', 'wpfinder_add_movie_metabox');

function wpfinder_movie_release_date_callback($post) {
    wp_nonce_field('wpfinder_save_movie_release_date', 'wpfinder_movie_nonce');
    $value = get_post_meta($post->ID, '_wpfinder_release_date', true);
    echo '<label for="wpfinder_release_date">Дата выхода: </label>';
    echo '<input type="date" id="wpfinder_release_date" name="wpfinder_release_date" value="' . esc_attr($value) . '" />';
}

function wpfinder_save_movie_release_date($post_id) {
    if (!isset($_POST['wpfinder_movie_nonce']) || !wp_verify_nonce($_POST['wpfinder_movie_nonce'], 'wpfinder_save_movie_release_date')) {
        return;
    }

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    if (isset($_POST['wpfinder_release_date'])) {
        update_post_meta($post_id, '_wpfinder_release_date', sanitize_text_field($_POST['wpfinder_release_date']));
    }
}
add_action('save_post', 'wpfinder_save_movie_release_date');

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

Лучшие плагины для работы с Custom Post Types и таксономиями

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

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

Использование этих плагинов значительно ускорит разработку и позволит гибко настраивать структуру сайта.

Вывод и использование мета-полей и таксономий в шаблонах

Для вывода даты выхода фильма в шаблоне single-movie.php используйте:

$release_date = get_post_meta(get_the_ID(), '_wpfinder_release_date', true);
if ($release_date) {
    echo '<p>Дата выхода: ' . esc_html($release_date) . '</p>';
}

Для вывода жанров, как уже показано выше, воспользуйтесь get_the_term_list(). Такой подход позволяет вывести всю необходимую информацию о кастомном контенте в удобном виде.

Советы по оптимизации и SEO для Custom Post Types

Для улучшения SEO CPT стоит учитывать следующие моменты:

  • Убедитесь, что для вашего CPT включены архивы (has_archive => true), чтобы поисковики индексировали список записей.
  • Правильно настройте ЧПУ (человеко-понятные URL) через параметр rewrite.
  • Добавьте поддержку мета-тегов SEO с помощью плагинов (например, Yoast SEO) — они обычно автоматически распознают CPT.
  • Создайте уникальные шаблоны для CPT, чтобы повысить качество контента и удобство пользователя.
  • Используйте внутренние ссылки и перелинковку между CPT и стандартными постами.

Такой подход обеспечит хорошую видимость ваших Custom Post Types в поисковых системах и улучшит пользовательский опыт.

Как создать автоматическую фильтрацию товаров WooCommerce по атрибутам
15.04.2026
Как отключить AJAX обновление корзины WooCommerce без потери функциональности
19.05.2026
Как настроить отложенный запуск задач в WordPress с помощью WP-Cron
02.03.2026
Как отключить автообновления WooCommerce без потери функциональности
28.05.2026
Как изменить URL страницы в WordPress без перенаправления
16.01.2026