WooCommerce: автоматическое изменение стоимости товаров по акции с учётом вариантов

Проблема: как автоматически применять скидки к товарам с вариациями в WooCommerce

WooCommerce позволяет создавать товары с вариациями (вариантами), у каждого из которых своя цена. Часто возникает задача массового применения акционных скидок к таким товарам, чтобы не менять цену вручную для каждой вариации. Без правильного подхода акционные цены могут не применяться или применяться некорректно.

Диагностика проблемы

Если вы заметили, что при массовом изменении цен по акции в WooCommerce:

  • цены вариаций не меняются, хотя цена родительского товара обновилась;
  • акция не отображается на страницах вариаций;
  • в корзине показывается старая цена без скидки;

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

Пошаговое решение: как программно обновить цены вариаций

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

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

function get_product_variations_ids( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product || $product->get_type() !== 'variable' ) {
        return [];
    }
    return $product->get_children(); // ID вариаций
}

2. Функция для массового применения скидки в процентах к вариациям

function apply_discount_to_variable_product( $product_id, $discount_percent ) {
    $variation_ids = get_product_variations_ids( $product_id );
    if ( empty( $variation_ids ) ) {
        return;
    }

    foreach ( $variation_ids as $variation_id ) {
        $variation = wc_get_product( $variation_id );
        if ( ! $variation ) {
            continue;
        }

        $regular_price = (float) $variation->get_regular_price();
        if ( $regular_price <= 0 ) {
            continue;
        }

        $sale_price = round( $regular_price * ( 1 - $discount_percent / 100 ), 2 );
        $variation->set_sale_price( $sale_price );
        $variation->save();
    }

    // Обновляем цены главного товара (для диапазона цен)
    $parent_product = wc_get_product( $product_id );
    if ( $parent_product ) {
        $parent_product->set_price( '' ); // Очистить цену, чтобы диапазон пересчитался автоматически
        $parent_product->save();
    }
}

3. Пример вызова функции

add_action( 'init', function() {
    $product_id = 123; // ID вариативного товара
    $discount = 20; // скидка в процентах
    apply_discount_to_variable_product( $product_id, $discount );
});

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

  • Зайдите на страницу товара с вариациями, цены должны показывать скидки с учётом акционного значения.
  • Проверьте каждую вариацию, цена продажи (sale price) должна быть установлена и отображаться.
  • Добавьте вариацию в корзину — цена в корзине должна соответствовать акционной.
  • В админке в карточке вариации проверьте, что у вариации установлены поля sale_price с правильным значением.

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

  • Обновление только родительского товара: не учитывает вариации, из-за чего цены вариаций остаются без изменений.
    Решение: всегда менять цены у вариаций через get_children().
  • Не вызов save() у вариаций: изменения не сохраняются в базе.
    Решение: вызвать метод save() после установки цены.
  • Неправильное округление цены: может привести к некорректному отображению или ошибкам в корзине.
    Решение: использовать round() с двумя знаками после запятой.
  • Отсутствие очистки цены родительского товара: диапазон цен не обновляется.
    Решение: у родительского товара вызвать set_price('') и save() для пересчёта.
  • Применение скидок к товарам без регулярной цены: приводит к некорректным ценам.
    Решение: пропускать вариации без заданной регулярной цены.

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

  • Для массового обновления большого количества товаров используйте WP-CLI, чтобы избежать таймаутов PHP.
  • При необходимости автоматизации акций по расписанию используйте WP-Cron или внешние задачи с WP-CLI.
  • Всегда делайте бэкап базы данных перед массовыми изменениями цен.
  • Не храните промо-цены вручную: используйте стандартные поля sale_price и регулярные цены, чтобы WooCommerce корректно рассчитывал цены и показывал скидки.
  • Для более гибких акций рассмотрите использование плагинов, например, WooCommerce Dynamic Pricing, но при этом помните о нагрузке на сайт.

Сравнение методов автоматизации изменения цен

МетодПреимуществаНедостатки
Программное обновление через WP API (код выше)Точный контроль, бесплатно, интеграция в кастомный функционалТребует навыков, риск ошибок без тестов
Использование плагинов для динамических ценГотовые правила, интерфейс, меньше кодаДополнительная нагрузка, стоимость, ограниченная гибкость
Ручное изменение цен в админкеПростота, не требует кодаМного времени, ошибки, не подходит для массовых изменений
Как создать собственный шорткод в WordPress
01.11.2025
Как создать собственный тип записи (Custom Post Type) в WordPress
03.12.2025
Как оптимизировать загрузку изображений в WordPress для ускорения сайта
10.12.2025
Кастомизация переходов между страницами в WordPress без перезагрузки
04.01.2026
Как удалить верстку WordPress: лучшие плагины и примеры кода
09.11.2025