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

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

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

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

Создание CPT позволяет:

  • Отделить контент по смыслу и структуре.
  • Настроить отдельные шаблоны вывода.
  • Добавить уникальные метаданные (например, цену товара, дату события).
  • Упростить администрирование и поиск по типу записи.

Для создания CPT можно использовать плагины, например Custom Post Type UI, но в статье мы рассмотрим создание через код, чтобы иметь полный контроль и оптимизировать работу.

Регистрация произвольного типа записи с помощью функции wporg_register_custom_post_type

Для создания CPT в WordPress используется функция register_post_type(). Мы создадим функцию с префиксом wporg_ для лучшей читаемости и предотвращения конфликтов.

function wporg_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'       => 'Поиск продуктов',
        'not_found'          => 'Продукты не найдены',
        'not_found_in_trash' => 'В корзине продукты не найдены'
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'rewrite'            => array('slug' => 'products'),
        'supports'           => array('title', 'editor', 'thumbnail'),
        'show_in_rest'       => true // поддержка Gutenberg и REST API
    );

    register_post_type('product', $args);
}
add_action('init', 'wporg_register_custom_post_type');

Этот код создаст новый тип записи «Продукт» с базовыми поддерживаемыми элементами: заголовок, содержимое и миниатюра.

Добавление поддержки метаданных: создание метабоксов

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

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

Добавим метабокс с двумя полями: цена и артикул.

function wporg_add_product_metabox() {
    add_meta_box(
        'wporg_product_details',
        'Детали продукта',
        'wporg_product_metabox_callback',
        'product',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wporg_add_product_metabox');

function wporg_product_metabox_callback($post) {
    // Безопасность
    wp_nonce_field('wporg_save_product_details', 'wporg_product_nonce');

    $price = get_post_meta($post->ID, '_wporg_product_price', true);
    $sku = get_post_meta($post->ID, '_wporg_product_sku', true);

    echo '<label for="wporg_product_price">Цена (руб.): </label>';
    echo '<input type="number" id="wporg_product_price" name="wporg_product_price" value="' . esc_attr($price) . '" step="0.01" min="0" style="width:100px" />';
    echo '<br><br>';
    echo '<label for="wporg_product_sku">Артикул: </label>';
    echo '<input type="text" id="wporg_product_sku" name="wporg_product_sku" value="' . esc_attr($sku) . '" style="width:200px" />';
}

Сохранение данных метаполей

Чтобы данные сохранялись, нужно обработать их при сохранении записи.

function wporg_save_product_details($post_id) {
    // Проверяем nonce
    if (!isset($_POST['wporg_product_nonce']) || !wp_verify_nonce($_POST['wporg_product_nonce'], 'wporg_save_product_details')) {
        return;
    }

    // Проверяем автосохранение
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    // Проверяем права
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    // Сохраняем цену
    if (isset($_POST['wporg_product_price'])) {
        $price = floatval($_POST['wporg_product_price']);
        update_post_meta($post_id, '_wporg_product_price', $price);
    }

    // Сохраняем артикул
    if (isset($_POST['wporg_product_sku'])) {
        $sku = sanitize_text_field($_POST['wporg_product_sku']);
        update_post_meta($post_id, '_wporg_product_sku', $sku);
    }
}
add_action('save_post', 'wporg_save_product_details');

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

Для отображения дополнительных данных на фронтенде используйте функцию get_post_meta(). Например, в шаблоне single-product.php можно добавить:

<?php
$price = get_post_meta(get_the_ID(), '_wporg_product_price', true);
$sku = get_post_meta(get_the_ID(), '_wporg_product_sku', true);
?>

<div class="product-details">
    <p><strong>Цена:</strong> <?php echo esc_html($price); ?> руб.</p>
    <p><strong>Артикул:</strong> <?php echo esc_html($sku); ?></p>
</div>

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

Если не хотите писать код, можно воспользоваться плагинами для метаполей, например:

  • Advanced Custom Fields — удобный интерфейс создания полей в админке, поддержка популярных типов полей.
  • Meta Box — более продвинутый плагин с расширенными возможностями.

Оба плагина отлично работают с CPT и помогают быстро развернуть нужные поля без программирования.

Резюме и рекомендации по созданию CPT с метаданными

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

В качестве дополнительной оптимизации советуем применять плагины Clearfy Pro для управления функционалом WordPress и повышения производительности сайта.

Скачать WP с оф. сайта Магазин проверенных платных тем