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

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

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

В таких случаях имеет смысл создать собственный тип данных (custom post type) и интегрировать его с WooCommerce, чтобы использовать преимущества корзины, учета и базы данных.

Шаги по добавлению собственного типа данных в WooCommerce

1. Регистрация собственного типа записи (custom post type)

Создадим тип записи wc_subscription для абонементов:

function register_wc_subscription_cpt() {
    $labels = array(
        'name' => 'Абонементы',
        'singular_name' => 'Абонемент',
        'menu_name' => 'Абонементы',
        'add_new_item' => 'Добавить новый абонемент',
        'edit_item' => 'Редактировать абонемент',
    );
    $args = array(
        'labels' => $labels,
        'public' => true,
        'show_in_menu' => true,
        'supports' => array('title', 'editor', 'custom-fields'),
        'capability_type' => 'product',
        'rewrite' => array('slug' => 'subscription'),
        'has_archive' => true,
    );
    register_post_type('wc_subscription', $args);
}
add_action('init', 'register_wc_subscription_cpt');

2. Добавление поддержки WooCommerce для нового типа записи

Чтобы интегрировать с WooCommerce, добавим поддержку 'product' и укажем, что данный тип будет вести себя подобно товару:

function add_wc_support_to_subscription_cpt() {
    add_post_type_support('wc_subscription', 'product');
}
add_action('init', 'add_wc_support_to_subscription_cpt', 20);

Однако WooCommerce жестко работает с product как post_type, поэтому для полноценной интеграции с корзиной, заказами и атрибутами придется дополнительно кастомизировать логику или использовать фильтры.

3. Создание метаполей и кастомных атрибутов

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

function add_subscription_custom_fields() {
    add_meta_box('subscription_duration', 'Срок действия (в днях)', function($post) {
        $value = get_post_meta($post->ID, '_subscription_duration', true);
        echo '<input type="number" name="subscription_duration" value="' . esc_attr($value) . '" min="1" />';
    }, 'wc_subscription', 'side');
}
add_action('add_meta_boxes', 'add_subscription_custom_fields');

function save_subscription_custom_fields($post_id) {
    if (array_key_exists('subscription_duration', $_POST)) {
        update_post_meta($post_id, '_subscription_duration', intval($_POST['subscription_duration']));
    }
}
add_action('save_post', 'save_subscription_custom_fields');

Проверка результата после внедрения

  • В админке WordPress появится новый пункт меню «Абонементы» с возможностью добавления и редактирования записей.
  • При создании записи доступно поле «Срок действия (в днях)».
  • Проверьте, что записи отображаются на фронтенде по адресу /subscription/ (если включено архивное отображение).
  • Для интеграции с корзиной и заказами протестируйте добавление такого абонемента вручную (через кастомные функции).

Частые ошибки и как их исправить

  • Ошибка: Тип записи не отображается в меню.
    Решение: Проверьте, что show_in_menu установлен в true и хуки подключены к init с правильным приоритетом.
  • Ошибка: WooCommerce не распознаёт новый тип записи как продукт.
    Решение: WooCommerce из коробки работает только с product. Для полноценной интеграции нужна мануальная доработка функций корзины, заказов и метаданных. Рассмотрите возможность использования «продуктов» с кастомными атрибутами или плагинов расширения.
  • Ошибка: Метаполя не сохраняются.
    Решение: Проверьте nonce и права пользователя, а также корректность функции save_post.

Практические советы по производительности и безопасности

  • Используйте sanitize_text_field() и intval() при сохранении данных из метаполей.
  • Для улучшения производительности кешируйте данные метаполей, если они часто используются на фронтенде.
  • Не регистрируйте слишком много кастомных типов записи — это увеличит нагрузку на базу и админку.
  • Для сложных интеграций с WooCommerce рассмотрите использование официальных хуков, например woocommerce_product_data_tabs и woocommerce_process_product_meta для расширения стандартных продуктов.

Сравнение методов добавления собственных данных в WooCommerce

МетодПреимуществаНедостатки
Кастомный тип записи с поддержкой WooCommerceГибкость, отдельная сущность, удобство управленияТребует доработки корзины и заказов, не поддерживается нативно WooCommerce
Кастомные поля у стандартного продуктаПолная интеграция с WooCommerce, простота в использованииОграничения по типу продукта, может быть неудобно для принципиально новых сущностей
Использование плагинов расширения (напр. WooCommerce Subscriptions)Готовые решения, поддержка обновленийЗависимость от стороннего кода, возможные ограничения по кастомизации
Как создать собственный шорткод в WordPress
07.11.2025
Создание динамической системы упоминаний пользователей в WordPress
09.04.2026
Как использовать WPCommunity для создания сообщества на WordPress
02.02.2026
Как создать отзывы с оценками в WordPress
22.02.2026
Как создать и использовать собственные виджеты в WordPress
30.11.2025

Мы занимаемся разработкой приложений и плагинов для WordPress. Ниже предлагаем ознакомиться с ними.