Как создать и использовать собственные типы записей (Custom Post Types) в WordPress

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

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

По умолчанию WordPress предоставляет несколько типов записей: посты (записи), страницы, вложения и несколько системных. Но часто стандартных типов недостаточно для организации контента. Например, если вы делаете сайт с каталогом книг, портфолио, событиями или отзывами, удобнее создать отдельный тип записи для каждого вида контента.

Собственные типы записей позволяют:

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

Это мощный инструмент, который делают WordPress гибким и масштабируемым.

Регистрация собственного типа записи: пример и объяснения

Для регистрации собственного типа записи используется функция register_post_type(). Ее нужно вызывать при инициализации WordPress, обычно в хук init. Рассмотрим пример регистрации типа записи wpreset_book для каталога книг.

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

    $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, // поддержка Gutenberg
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-book',
    );

    register_post_type('wpreset_book', $args);
}

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

Основные параметры функции register_post_type

Параметры $args позволяют настроить поведение типа записи:

  • public — делает тип записи доступным на сайте и в админке.
  • has_archive — позволяет автоматически создавать архив с URL-адресом site.ru/books/.
  • rewrite — задает правила для ЧПУ.
  • supports — указывает, какие стандартные функциональности редактора будут доступны.
  • show_in_rest — делает тип записи доступным в REST API.

Добавление метаполей для собственного типа записей

Для расширения функционала часто требуется добавить дополнительные поля для хранения информации. Например, для книги это может быть автор, год издания или ISBN.

Самый простой способ — использовать плагин Advanced Custom Fields (ACF), но если нужен кодовый вариант, можно добавить метабоксы вручную.

add_action('add_meta_boxes', 'wpreset_add_book_meta_box');
function wpreset_add_book_meta_box() {
    add_meta_box(
        'wpreset_book_details',
        'Детали книги',
        'wpreset_book_meta_box_callback',
        'wpreset_book',
        'normal',
        'high'
    );
}

function wpreset_book_meta_box_callback($post) {
    wp_nonce_field('wpreset_save_book_meta', 'wpreset_book_meta_nonce');

    $author = get_post_meta($post->ID, '_wpreset_book_author', true);
    $year = get_post_meta($post->ID, '_wpreset_book_year', true);

    echo '<p><label for="wpreset_book_author">Автор:</label><br />';
    echo '<input type="text" id="wpreset_book_author" name="wpreset_book_author" value="' . esc_attr($author) . '" size="25" /></p>';

    echo '<p><label for="wpreset_book_year">Год издания:</label><br />';
    echo '<input type="number" id="wpreset_book_year" name="wpreset_book_year" value="' . esc_attr($year) . '" size="4" /></p>';
}

add_action('save_post', 'wpreset_save_book_meta');
function wpreset_save_book_meta($post_id) {
    if (!isset($_POST['wpreset_book_meta_nonce']) || !wp_verify_nonce($_POST['wpreset_book_meta_nonce'], 'wpreset_save_book_meta')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wpreset_book_author'])) {
        update_post_meta($post_id, '_wpreset_book_author', sanitize_text_field($_POST['wpreset_book_author']));
    }
    if (isset($_POST['wpreset_book_year'])) {
        update_post_meta($post_id, '_wpreset_book_year', intval($_POST['wpreset_book_year']));
    }
}

Этот код добавляет метабокс с двумя полями: автор и год издания. При сохранении записи данные сохраняются в пользовательские метаполя.

Отображение собственных типов записей на сайте

Чтобы вывести записи собственного типа на сайте, можно создать отдельный шаблон архива archive-wpreset_book.php в вашей теме. В нем используйте стандартный цикл WordPress по типу записи:

<?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>
            <?php echo esc_html(get_post_meta(get_the_ID(), '_wpreset_book_author', true)); ?>, 
            <?php echo esc_html(get_post_meta(get_the_ID(), '_wpreset_book_year', true)); ?>
        </li>
    <?php endwhile; ?>
    </ul>
<?php else : ?>
    <p>Книги не найдены.</p>
<?php endif; ?>

<?php get_footer(); ?>

Это позволит красиво вывести список книг с автором и годом издания. Для одиночных страниц можно создать шаблон single-wpreset_book.php, где оформить вывод в более детальном виде.

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

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

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

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

Советы по оптимизации и безопасности собственных типов записей

При работе с CPT стоит помнить несколько важных моментов для корректной работы и безопасности:

  • Всегда используйте префиксы в названиях функций и метаполей, чтобы избежать конфликтов с другими плагинами и темами. В примерах мы использовали префикс wpreset_.
  • Обязательно проверяйте nonce и права доступа при сохранении метаданных, чтобы предотвратить CSRF-атаки.
  • Если планируете активно использовать REST API, убедитесь, что show_in_rest включен.
  • Для SEO полезно настраивать ЧПУ и добавлять метаданные с помощью SEO-плагинов или вручную.

Заключение

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

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

Как удалить все плагины WordPress одним кликом
26.01.2026
Как правильно удалить WooCommerce без потери данных
03.05.2026
Как удалить все записи WordPress одной кнопкой
09.12.2025
Как удалить или отключить плагин WordPress без доступа к админке
13.01.2026
Как автоматизировать удаление старого контента в WordPress
23.03.2026