Как программно изменить количество вариантов товара в WooCommerce

Диагностика проблемы: почему нужно менять количество вариантов товара программно

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

Если вы замечаете, что:

  • Невозможно быстро добавить или удалить вариации по заданному правилу.
  • При массовом обновлении вариаций возникает слишком много ручной работы.
  • Вариации устарели и требуют быстрой синхронизации с базой данных.

— значит, стоит использовать программный подход.

Как получить и изменить вариации товара через код

В WooCommerce вариации — это дочерние продукты с типом product_variation, привязанные к родительскому товару с типом variable. Для работы с вариациями используем стандартные функции WooCommerce и WordPress.

Получение вариаций товара

Для начала получим ID всех вариаций для заданного товара:

$parent_product_id = 123; // ID вариативного товара

$variations = wc_get_products(array(
    'type' => 'variation',
    'parent' => $parent_product_id,
    'limit' => -1
));

foreach ($variations as $variation) {
    echo 'Variation ID: ' . $variation->get_id() . "\n";
}

Удаление вариаций программно

Чтобы удалить вариации, например, все варианты для товара, используйте следующий код:

foreach ($variations as $variation) {
    wp_delete_post($variation->get_id(), true); // true — без перемещения в корзину
}

Добавление новой вариации

Пример создания вариации с атрибутом color:

function create_variation($parent_id, $attributes, $regular_price) {
    $variation_post = array(
        'post_title'  => 'Variation for product ' . $parent_id,
        'post_name'   => 'product-' . $parent_id . '-variation',
        'post_status' => 'publish',
        'post_parent' => $parent_id,
        'post_type'   => 'product_variation',
        'guid'        => home_url() . '/?product_variation=product-' . $parent_id . '-variation'
    );

    $variation_id = wp_insert_post($variation_post);

    if ($variation_id) {
        // Установка атрибутов вариации
        foreach ($attributes as $attribute_name => $attribute_value) {
            update_post_meta($variation_id, 'attribute_' . sanitize_title($attribute_name), sanitize_title($attribute_value));
        }
        // Установка цены
        update_post_meta($variation_id, '_regular_price', $regular_price);
        update_post_meta($variation_id, '_price', $regular_price);
    }
    return $variation_id;
}

// Используем функцию
$new_variation_id = create_variation(123, array('color' => 'blue'), '1500');

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

  1. Получите все существующие вариации товара.
  2. Удалите ненужные вариации (например, с определенными атрибутами).
  3. Создайте новые вариации с нужными атрибутами и ценами.
  4. Очистите кеш WooCommerce и обновите данные товара.

Пример кода для полного цикла изменения вариаций

$parent_product_id = 123;

// Получаем все вариации
$variations = wc_get_products(array(
    'type' => 'variation',
    'parent' => $parent_product_id,
    'limit' => -1
));

// Удаляем вариации с цветом 'red'
foreach ($variations as $variation) {
    $color = get_post_meta($variation->get_id(), 'attribute_color', true);
    if ($color === 'red') {
        wp_delete_post($variation->get_id(), true);
    }
}

// Добавляем новую вариацию с цветом 'green'
$new_attributes = array('color' => 'green');
$new_price = '1200';
create_variation($parent_product_id, $new_attributes, $new_price);

// Обновляем родительский товар, чтобы WooCommerce пересчитал данные
wc_delete_product_transients($parent_product_id);
wc_update_product_stock_status($parent_product_id);

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

  • Перейдите в админпанель WooCommerce, откройте редактирование вариативного товара и убедитесь, что вариации обновились.
  • Проверьте на сайте отображение вариантов товара в карточке — новые вариации должны быть доступны для выбора.
  • Выполните код через wp-cli или подключенный скрипт и убедитесь, что ошибок PHP нет.
  • Для отладки можно вывести ID вариаций до и после изменений.

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

  • Вариации не отображаются на фронтенде: проверьте, что у вариаций правильно установлены атрибуты с префиксом attribute_ и что атрибуты объявлены у родительского товара.
  • Удаление вариаций не происходит: убедитесь, что используете wp_delete_post($id, true) для полного удаления, а не перемещения в корзину.
  • Неверные данные цены у вариаций: обязательно нужно устанавливать и _regular_price, и _price, иначе WooCommerce не отобразит цену.
  • Кеширование мешает обновлению: после изменений вызовите wc_delete_product_transients($product_id) и, при необходимости, очистите кэш сайта.

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

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

Сравнение подходов: плагин vs код vs ручное управление

МетодПлюсыМинусыКогда использовать
Ручное управлениеПросто, без кодаМедленно, не масштабируетсяМалое количество вариаций
Плагины для управления вариациямиИнтерфейс, автоматизацияНагрузка, возможные конфликтыСредние объемы и частые изменения
Программное управление через кодГибкость, автоматизация, масштабируемостьТребует навыков разработкиБольшие каталоги, интеграции, массовые обновления
Как создать дополнительное поле в форме регистрации WordPress без плагинов
17.01.2026
Как установить и настроить Nginx для WordPress
21.02.2026
Как удалить или изменить поля в форме оплаты WooCommerce без плагинов
17.06.2026
Как избежать конфликтов при использовании WooCommerce и кастомных плагинов в WordPress
20.04.2026
Как удалить неиспользуемые метаданные в WordPress для оптимизации сайта
10.01.2026