WooCommerce: автоматическое изменение стоимости вариативных товаров

Проблема с обновлением цен вариативных товаров в WooCommerce

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

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

  • Изменили цену у варианта программно, но цена у родительского товара не обновилась.
  • На странице товара отображается старая цена, хотя в базе она изменилась.
  • Минимальная и максимальная цена у вариативного товара не синхронизирована с вариантами.

Проверить текущие цены можно через админку WooCommerce в разделе Товары > Вариации, либо через базу данных в таблицах wp_postmeta по ключам _price, _regular_price, _sale_price.

Как программно изменить цены у вариативных товаров и вариантов

Для корректного обновления цен нужно изменить цены у каждого варианта и потом пересчитать и обновить цены у родительского вариативного товара. Для этого используем WooCommerce API и функции класса WC_Product_Variable.

Пример кода: изменение цены варианта и обновление вариативного товара

function update_variation_price( $variation_id, $new_price ) {
    $variation = wc_get_product( $variation_id );
    if ( ! $variation || 'variation' !== $variation->get_type() ) {
        return false;
    }

    $variation->set_regular_price( $new_price );
    $variation->set_price( $new_price );
    $variation->save();

    // Обновляем цены родительского товара
    $parent_id = $variation->get_parent_id();
    $variable_product = wc_get_product( $parent_id );
    if ( $variable_product && 'variable' === $variable_product->get_type() ) {
        $variable_product->save(); // вызовет перерасчет минимальной и максимальной цены
    }

    return true;
}

// Пример вызова:
update_variation_price( 1234, 799 );

В данном примере мы меняем цену варианта с ID 1234 на 799 рублей, после чего вызываем save() у родительского вариативного товара, чтобы WooCommerce пересчитал диапазон цен.

Массовое изменение цен всех вариантов

Если нужно применить изменение к каждому варианту, например повысить цену на 10%, используем следующий код:

function update_all_variations_prices( $variable_product_id, $percent ) {
    $product = wc_get_product( $variable_product_id );
    if ( ! $product || 'variable' !== $product->get_type() ) {
        return false;
    }

    $variations = $product->get_children();
    foreach ( $variations as $variation_id ) {
        $variation = wc_get_product( $variation_id );
        $old_price = floatval( $variation->get_regular_price() );
        $new_price = round( $old_price * ( 1 + $percent / 100 ), 2 );
        $variation->set_regular_price( $new_price );
        $variation->set_price( $new_price );
        $variation->save();
    }

    $product->save(); // обновить диапазон цен вариативного товара
    return true;
}

// Пример вызова: увеличить цены на 10%
update_all_variations_prices( 5678, 10 );

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

  • В админке WooCommerce откройте вариативный товар и проверьте цены вариантов.
  • Проверьте, что диапазон цен отобразился корректно на странице товара на фронтенде.
  • Используйте инструменты разработчика браузера, чтобы убедиться, что цены обновились без кэширования.
  • При необходимости очистите кэш плагинов кеширования.

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

  • Ошибка: Цена варианта изменена, но цена вариативного товара не обновилась.
    Причина: Не вызвана функция $variable_product->save() для пересчёта диапазона цен.
    Решение: Добавьте вызов save() у вариативного товара после изменения вариантов.
  • Ошибка: При массовом обновлении цены не применяются.
    Причина: Не сохранены объекты вариаций или неправильно рассчитана новая цена.
    Решение: Проверьте, что вызван $variation->save() и цены передаются как строки или числа с точностью.
  • Ошибка: Кэширование мешает увидеть новые цены.
    Причина: Активны плагины кэширования или CDN.
    Решение: Очистите кэш сайта и браузера.

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

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

Сравнение способов изменения цен вариативных товаров

СпособПлюсыМинусы
Ручное редактирование в админкеПросто, не требует кодаНе подходит для массовых обновлений и автоматизации
Программное обновление через WC API (код)Автоматизация, точный контроль, подходит для сложной логикиТребует навыков разработки, возможно влияние на производительность при большом объеме
Плагины массового редактированияУдобный интерфейс, готовые шаблоныМогут влиять на производительность, не всегда гибкие
Как автоматизировать управление ролями пользователей в WordPress
08.01.2026
Автоматизация обработки форм в WordPress с WPRemark
24.12.2025
WooCommerce: автоматическое изменение стоимости вариативных товаров
05.07.2026
Как использовать WP-Cron для решения проблем с задержкой запусков задач в WordPress
18.04.2026
Как использовать хуки в WordPress для расширения функциональности
24.11.2025