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

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

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

Собственный тип записи позволяет расширить функциональность WordPress, добавляя новые сущности с собственными полями и поведением. Например, для сайта с каталогом фильмов можно создать тип записи «Фильм», где будут отдельные поля для режиссёра, года выпуска, жанра и т.д. Это намного удобнее, чем пытаться хранить всё в стандартных постах.

Использование собственных типов записи повышает удобство управления контентом и упрощает разработку. Это особенно важно для крупных проектов с нестандартной структурой данных.

Для создания CPT используется функция register_post_type(), которую следует вызывать на хуке init.

Как зарегистрировать собственный тип записи: базовый пример

Добавим в файл functions.php вашей темы или в собственный плагин следующий код:

add_action('init', 'wpone_register_movie_post_type');
function wpone_register_movie_post_type() {
    $labels = [
        '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 = [
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'rewrite'            => ['slug' => 'movies'],
        'supports'           => ['title', 'editor', 'thumbnail', 'custom-fields'],
        'show_in_rest'       => true
    ];

    register_post_type('wpone_movie', $args);
}

В результате в админке появится новый раздел «Фильмы» с привычным функционалом. Аргумент show_in_rest включает поддержку REST API, что важно для современных приложений и редакторов.

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

Чтобы расширить тип записи дополнительными полями (например, год выпуска, режиссёр), создадим метабоксы. Для этого используем хуки add_meta_boxes и save_post.

Пример добавления метабокса для года выпуска:

add_action('add_meta_boxes', 'wpone_add_movie_metabox');
function wpone_add_movie_metabox() {
    add_meta_box('wpone_movie_year', 'Год выпуска', 'wpone_movie_year_metabox_callback', 'wpone_movie', 'side');
}

function wpone_movie_year_metabox_callback($post) {
    wp_nonce_field('wpone_save_movie_year', 'wpone_movie_year_nonce');
    $value = get_post_meta($post->ID, '_wpone_movie_year', true);
    echo '<input type="number" name="wpone_movie_year" value="' . esc_attr($value) . '" style="width: 100%;" min="1900" max="2100" />';
}

add_action('save_post', 'wpone_save_movie_year');
function wpone_save_movie_year($post_id) {
    if (!isset($_POST['wpone_movie_year_nonce']) || !wp_verify_nonce($_POST['wpone_movie_year_nonce'], 'wpone_save_movie_year')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wpone_movie_year'])) {
        update_post_meta($post_id, '_wpone_movie_year', intval($_POST['wpone_movie_year']));
    }
}

С помощью этого кода вы добавите поле для года выпуска в боковую панель при редактировании записи типа «Фильм».

Вывод собственных типов записей на фронтенде

Для отображения новых типов записей на сайте можно создать отдельный шаблон архивной страницы и шаблон одиночной записи:

  • archive-wpone_movie.php — архив всех фильмов
  • single-wpone_movie.php — страница одного фильма

Пример простого цикла в архиве:

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

Так вы сможете вывести список фильмов с их годом выпуска.

Использование плагинов для работы с собственными типами записей

Если хочется упростить процесс создания CPT и метаполей, можно воспользоваться плагинами. Например:

  • Clearfy Pro — позволяет оптимизировать сайт и управлять CPT
  • WPRemark — система отзывов, использующая CPT

Однако знание создания CPT вручную полезно для гибкой настройки и отладки.

Советы и лучшие практики при создании CPT

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

2. Включайте поддержку REST API (show_in_rest => true) для совместимости с Gutenberg и внешними приложениями.

3. Правильно настраивайте права доступа и отображение в меню.

4. Используйте кодировку и функции WordPress для безопасности и совместимости.

Создание собственных типов записей — мощный инструмент для расширения WordPress под конкретные задачи. Следуя этим рекомендациям и используя примеры, вы быстро освоите разработку и сможете создавать сложные проекты с удобным управлением контентом.

Как использовать REST API WordPress для создания собственных приложений
13.11.2025
Как создать многоуровневое меню в WordPress с подменю
01.03.2026
Как добавить автоматическое сохранение записей в WordPress
13.12.2025
Как создать собственный блок для Gutenberg в WordPress
16.01.2026
Как использовать WPCommunity для создания приватного клубного сайта на WordPress
19.01.2026