WooCommerce: автоматическое создание атрибутов и вариантов товаров через код

Диагностика задачи: зачем автоматически создавать атрибуты и варианты товаров

В крупных магазинах WooCommerce товарные позиции часто имеют множество вариантов — цвета, размеры, материалы и т.п. Ручное создание атрибутов и вариантов для каждого товара занимает много времени и подвержено ошибкам. Автоматизация процесса с помощью кода позволяет быстро создавать нужные атрибуты в базе и привязывать их к товарам. Это особенно актуально при импорте каталога из внешних систем или при массовом обновлении товаров.

Пошаговое решение: как программно создавать атрибуты и варианты товаров в WooCommerce

1. Создание атрибута в WooCommerce через код

Для начала создадим глобальный атрибут (например, "Цвет") с предопределёнными значениями.

function wprobot_create_global_attribute() {
    $attribute_name = 'Цвет';
    $attribute_slug = wc_sanitize_taxonomy_name($attribute_name);

    if ( ! taxonomy_exists( wc_attribute_taxonomy_name( $attribute_slug ) ) ) {
        $args = array(
            'slug'    => $attribute_slug,
            'name'    => $attribute_name,
            'type'    => 'select',
            'order_by'=> 'menu_order',
            'has_archives' => false,
        );
        wc_create_attribute( $args );
        // Обновляем кэш атрибутов
        delete_transient( 'wc_attribute_taxonomies' );
    }
}
add_action( 'init', 'wprobot_create_global_attribute' );

2. Добавление терминов (значений) к атрибуту

После создания атрибута нужно добавить варианты, например "Красный", "Синий" и "Зелёный".

function wprobot_add_terms_to_attribute() {
    $attribute_slug = 'pa_cvet'; // pa_ + слаг атрибута
    $terms = array('Красный', 'Синий', 'Зелёный');

    foreach ( $terms as $term_name ) {
        if ( ! term_exists( $term_name, $attribute_slug ) ) {
            wp_insert_term( $term_name, $attribute_slug );
        }
    }
}
add_action( 'init', 'wprobot_add_terms_to_attribute', 20 );

3. Создание вариативного товара с привязкой атрибута и вариантов

Теперь создадим простой вариативный товар и добавим к нему атрибут с вариантами.

function wprobot_create_variable_product_with_attributes() {
    // Проверяем, чтобы не создавать товар несколько раз
    if ( get_page_by_title( 'Тестовый товар', OBJECT, 'product' ) ) {
        return;
    }

    $product = new WC_Product_Variable();
    $product->set_name( 'Тестовый товар' );
    $product->set_status( 'publish' );
    $product->save();

    $attribute_taxonomy = 'pa_cvet';
    $terms = get_terms( array('taxonomy' => $attribute_taxonomy, 'hide_empty' => false) );

    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
        $term_slugs = wp_list_pluck( $terms, 'slug' );

        $product_attributes = array();
        $product_attributes[ $attribute_taxonomy ] = array(
            'name'         => $attribute_taxonomy,
            'value'        => '',
            'is_visible'   => 1,
            'is_variation' => 1,
            'is_taxonomy'  => 1,
        );

        update_post_meta( $product->get_id(), '_product_attributes', $product_attributes );

        wp_set_object_terms( $product->get_id(), $term_slugs, $attribute_taxonomy );

        // Создаём вариации
        foreach ( $terms as $term ) {
            $variation = new WC_Product_Variation();
            $variation->set_parent_id( $product->get_id() );
            $variation->set_attributes( array( $attribute_taxonomy => $term->slug ) );
            $variation->set_regular_price( 1000 );
            $variation->save();
        }
    }
}
add_action( 'init', 'wprobot_create_variable_product_with_attributes', 30 );

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

1. В админке WooCommerce перейдите в Товары и найдите "Тестовый товар".
2. Откройте редактор товара — в блоке атрибутов должен отображаться атрибут "Цвет" с тремя вариантами.
3. В клиентской части товара на сайте должны быть доступны для выбора варианты "Красный", "Синий" и "Зелёный".
4. Проверьте, что каждая вариация отображается с ценой 1000 рублей и отдельным SKU (если нужно, добавьте код для SKU).

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

  • Ошибка: Атрибут не отображается в списке атрибутов товара.
    Причина: Не обновлён transient с атрибутами.
    Решение: После создания атрибута вызовите delete_transient( 'wc_attribute_taxonomies' ); и обновите страницу.
  • Ошибка: Вариации не создаются или не привязываются к товару.
    Причина: Неверный ключ атрибута: используется имя вместо слага с префиксом pa_.
    Решение: Убедитесь, что используется правильный слаг таксономии, например pa_cvet.
  • Ошибка: Товар создаётся повторно при каждом обновлении.
    Причина: Нет проверки на существование товара.
    Решение: Добавьте проверку через get_page_by_title или другой способ идентификации.

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

  • Вызовы создания атрибутов и товаров лучше запускать однократно, например, через WP-CLI или отдельный скрипт, а не на каждом хук init.
  • При массовом импорте используйте транзакции базы данных или пакетную обработку, чтобы избежать перегрузки сервера.
  • Для оптимизации используйте кеширование результатов создания атрибутов и проверок.
  • Для безопасности проверяйте права пользователя и nonce, если внедряете код в админку.

Сравнение вариантов создания атрибутов и вариантов товаров

МетодПлюсыМинусыКогда использовать
Ручное создание через админкуПросто, не требует кодаДолго при большом количестве товаров, риск ошибокМаленькие магазины, единичные товары
Импорт CSV с атрибутамиАвтоматизация массовых товаровСложность подготовки файла, ограниченные возможностиСредние магазины, импорт из ERP
Программное создание через код (пример выше)Полный контроль, масштабируемостьТребует навыков программированияБольшие магазины, интеграции, автоматизация
Как автоматически удалять спам комментарии в WordPress
30.11.2025
Как автоматически создавать резервные копии WordPress на Google Drive
19.02.2026
Как автоматически отключить и заменить файлы CSS в WordPress
22.01.2026
Как настроить автоматический импорт контента из RSS в WordPress
13.04.2026
WooCommerce: автоматическая синхронизация заказов с внешними системами через Webhook
17.07.2026