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

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

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

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

Использование CPT упрощает управление данными, улучшает пользовательский интерфейс в админке и повышает качество SEO за счет правильной организации контента.

Основные преимущества кастомных типов данных

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

Создание собственного типа данных через функцию register_post_type

Для создания кастомного типа данных в WordPress используется функция register_post_type. Рекомендуется регистрировать CPT в хуке init для корректной работы.

function wpdata_register_custom_post_type() {
    $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'       => 'Искать книги',
        'parent_item_colon'  => 'Родительская книга:',
        'not_found'          => 'Книги не найдены.',
        'not_found_in_trash' => 'В корзине книги не найдены.'
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array('slug' => 'books'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
        'show_in_rest'       => true // Включаем поддержку Gutenberg и REST API
    );

    register_post_type('wpdata_book', $args);
}
add_action('init', 'wpdata_register_custom_post_type');

В этом примере создается тип данных «Книги» с поддержкой основных возможностей, включая редактор, миниатюры и комментарии. Важно правильно выбрать slug и имя типа, чтобы избежать конфликтов.

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

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

Создание мета-бокса для CPT

function wpdata_add_custom_meta_box() {
    add_meta_box(
        'wpdata_book_details',
        'Детали книги',
        'wpdata_book_meta_box_callback',
        'wpdata_book',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wpdata_add_custom_meta_box');

function wpdata_book_meta_box_callback($post) {
    wp_nonce_field('wpdata_save_book_details', 'wpdata_book_nonce');

    $author = get_post_meta($post->ID, '_wpdata_book_author', true);
    $year = get_post_meta($post->ID, '_wpdata_book_year', true);
    $isbn = get_post_meta($post->ID, '_wpdata_book_isbn', true);

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

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

    echo '<br/><br/><label for="wpdata_book_isbn">ISBN:</label>';
    echo '<input type="text" id="wpdata_book_isbn" name="wpdata_book_isbn" value="' . esc_attr($isbn) . '" size="20" />';
}

Сохранение метаданных при сохранении записи

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

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

    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (isset($_POST['wpdata_book_author'])) {
        update_post_meta($post_id, '_wpdata_book_author', sanitize_text_field($_POST['wpdata_book_author']));
    }
    if (isset($_POST['wpdata_book_year'])) {
        update_post_meta($post_id, '_wpdata_book_year', intval($_POST['wpdata_book_year']));
    }
    if (isset($_POST['wpdata_book_isbn'])) {
        update_post_meta($post_id, '_wpdata_book_isbn', sanitize_text_field($_POST['wpdata_book_isbn']));
    }
}
add_action('save_post', 'wpdata_save_book_details');

Создание и использование таксономий для собственного типа данных

Таксономии помогают группировать записи CPT по категориям, тегам или другим параметрам. Вы можете создавать собственные таксономии или использовать встроенные.

Регистрация пользовательской таксономии

function wpdata_register_book_taxonomies() {
    $labels = array(
        'name'              => 'Жанры',
        'singular_name'     => 'Жанр',
        'search_items'      => 'Искать жанры',
        'all_items'         => 'Все жанры',
        'parent_item'       => 'Родительский жанр',
        'parent_item_colon' => 'Родительский жанр:',
        '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('wpdata_genre', array('wpdata_book'), $args);
}
add_action('init', 'wpdata_register_book_taxonomies');

Теперь для записей типа «Книга» доступна таксономия «Жанры» с древовидной структурой, что удобно для классификации.

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

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

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$args = array(
    'post_type' => 'wpdata_book',
    'posts_per_page' => 10,
    'paged' => $paged,
);

if (!empty($_GET['genre'])) {
    $args['tax_query'] = array(
        array(
            'taxonomy' => 'wpdata_genre',
            'field'    => 'slug',
            'terms'    => sanitize_text_field($_GET['genre']),
        ),
    );
}

$wpdata_query = new WP_Query($args);

if ($wpdata_query->have_posts()) {
    while ($wpdata_query->have_posts()) {
        $wpdata_query->the_post();
        echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
        echo '<div>' . get_the_excerpt() . '</div>';
    }

    // Пагинация
    echo paginate_links(array(
        'total' => $wpdata_query->max_num_pages
    ));
} else {
    echo '<p>Книги не найдены.</p>';
}
wp_reset_postdata();

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

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

Хотя создание CPT и мета-полей вручную даёт полный контроль, иногда полезно использовать готовые решения:

  • Clearfy Pro — помогает оптимизировать сайт и добавить расширенные возможности для кастомных типов;
  • WPRemark — плагин для расширенного управления комментариями, который можно адаптировать под собственные типы записей;
  • Advanced Custom Fields (ACF) — популярный плагин для удобного создания и управления пользовательскими полями, совместим с CPT.

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

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

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

  • Используйте wp_nonce_field и проверяйте nonce при сохранении данных, чтобы предотвратить CSRF-атаки;
  • Обрабатывайте данные с помощью sanitize_text_field, intval и других функций очистки;
  • Не регистрируйте CPT и таксономии без необходимости — это влияет на нагрузку;
  • Для больших объемов данных используйте индексы по метаданным и оптимизируйте запросы;
  • Кешируйте результаты запросов и используйте REST API для асинхронного взаимодействия.

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

Как создать автоформы в WordPress для сбора данных с автоматической обработкой
18.02.2026
Эффективное логирование и отладка в разработке WordPress
16.03.2026
Как создать настройку автоматического экспорта данных WordPress по расписанию
09.01.2026
Как создать и использовать собственный тип данных в WordPress
22.02.2026
WooCommerce: корректное обновление корзины при AJAX-запросах
08.07.2026