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

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

В WooCommerce при работе с товарами, имеющими множество атрибутов, создание вариаций вручную — рутинная и затратная по времени задача. Особенно это заметно, если у товара десятки или сотни комбинаций атрибутов, например, размер, цвет, материал и др. Заполнение каждой вариации вручную через админку может занять часы и привести к ошибкам.

Типичная ситуация: товары с несколькими атрибутами, где комбинации вариантов нужно генерировать автоматически для ускорения работы и снижения ошибок.

Пошаговое решение: код для автоматического создания вариаций

1. Подготовка товара с атрибутами

Перед запуском автоматизации убедитесь, что у товара в WooCommerce заданы атрибуты с нужными значениями и они отмечены как используемые для вариаций.

Это можно проверить в админке товара на вкладке «Атрибуты» — галочка «Использовать для вариаций» должна быть установлена.

2. Код для генерации вариаций

Добавьте следующий код в functions.php вашей темы или в отдельный плагин. Он автоматически сгенерирует все возможные комбинации вариаций для указанного товара (замените $product_id на ID вашего вариативного товара):

function create_variations_auto($product_id) {
    if (!class_exists('WC_Product_Variable')) {
        return;
    }

    $product = wc_get_product($product_id);
    if (!$product || $product->get_type() !== 'variable') {
        return;
    }

    $attributes = $product->get_attributes();
    if (empty($attributes)) {
        return;
    }

    $variations_data = [];
    foreach ($attributes as $attribute) {
        if (!$attribute->get_variation()) {
            // Атрибут не для вариаций
            continue;
        }
        $options = $attribute->get_options();
        $taxonomy = $attribute->get_name();

        $terms = [];
        if (taxonomy_exists($taxonomy)) {
            foreach ($options as $term_id) {
                $term = get_term($term_id);
                if ($term) {
                    $terms[] = $term->slug;
                }
            }
        } else {
            // Пользовательский атрибут
            $terms = $options;
        }

        $variations_data[] = [
            'taxonomy' => $taxonomy,
            'terms' => $terms,
        ];
    }

    // Рекурсивная функция для комбинаций
    $combinations = [];
    function combine_attributes($arrays, $i = 0, $current = []) {
        global $combinations;
        if ($i === count($arrays)) {
            $combinations[] = $current;
            return;
        }
        foreach ($arrays[$i]['terms'] as $term_slug) {
            $new_current = $current;
            $new_current[$arrays[$i]['taxonomy']] = $term_slug;
            combine_attributes($arrays, $i + 1, $new_current);
        }
    }

    combine_attributes($variations_data);

    // Создаем вариации
    foreach ($combinations as $combination) {
        $variation = new WC_Product_Variation();
        $variation->set_parent_id($product_id);
        $attributes_variation = [];
        foreach ($combination as $taxonomy => $term_slug) {
            // Для пользовательских атрибутов taxonomy не начинается с pa_
            $name = taxonomy_exists($taxonomy) ? $taxonomy : sanitize_title($taxonomy);
            $attributes_variation['attribute_' . $name] = $term_slug;
        }
        $variation->set_attributes($attributes_variation);
        $variation->set_regular_price('100'); // Здесь можно задать цену вариации
        $variation->save();
    }
}

// Запуск функции для товара с ID 123
// create_variations_auto(123);

Обратите внимание, что функция create_variations_auto создаст все возможные вариации без дубликатов. Цену, наличие и другие параметры можно модифицировать в цикле перед сохранением вариации.

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

  • Перейдите в админку WooCommerce > Товары > выберите вариативный товар.
  • Вкладка «Вариации»: проверьте, что созданы все комбинации вариантов.
  • На фронтенде товара проверьте, что выпадающие списки с атрибутами работают корректно, можно выбрать любые комбинации.
  • Проверьте, что цена и наличие корректно отображаются для каждой вариации.

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

  • Вариации не создаются: убедитесь, что товар имеет тип «вариативный» и атрибуты отмечены как «для вариаций».
  • Пустые вариации или не те атрибуты: проверьте, что атрибуты привязаны к таксономиям (типа pa_color) и что значения атрибутов существуют.
  • Дублирование вариаций: перед запуском функции удалите старые вариации вручную или добавьте проверку на существующие вариации.
  • Ошибка с пользовательскими атрибутами: в коде предусмотрена обработка пользовательских атрибутов, но для них нужно использовать slug атрибута без префикса pa_.

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

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

Сравнение способов создания вариаций

МетодПлюсыМинусыКогда использовать
Ручное создание в админкеПростота, нет кодаДолго при большом количестве вариацийМало вариаций, простые товары
Плагины генерации вариацийАвтоматизация, удобный интерфейсМожет быть платным, нагрузка на сайтСреднее количество вариаций, без кастомного кода
Код в functions.php (как в статье)Полный контроль, автоматизация, бесплатноТребует навыков, возможны ошибки без тестовБольшие магазины, кастомные сценарии

Наш каталог плагинов WordPress