WooCommerce: как автоматически изменять стоимость товара при изменении вариаций

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

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

Проверить проблему можно так: откройте страницу товара с вариациями, выберите разные варианты атрибутов и посмотрите, меняется ли цена без перезагрузки страницы. Если цена статична — потребуется вмешательство.

Основные причины проблемы:

  • Отсутствие корректного JavaScript обновления цены при выборе вариации.
  • Кэширование страниц или скриптов мешает обновлению.
  • Конфликты с другими плагинами, которые изменяют поведение вариаций.

Пошаговое решение: добавляем автоматическую корректировку цены вариации

Рассмотрим пример, как автоматически изменять цену вариации с помощью фильтра woocommerce_get_price_html и AJAX-скрипта, который обновляет цену при выборе вариации.

1. Добавление PHP-фильтра для изменения цены вариации

В functions.php темы (или в вашем плагине) добавьте следующий код, который добавляет 10% скидку к цене вариации:

add_filter('woocommerce_get_price_html', 'custom_variation_price_discount', 10, 2);
function custom_variation_price_discount($price_html, $product) {
    if ($product->is_type('variation')) {
        $regular_price = floatval($product->get_regular_price());
        $discounted_price = $regular_price * 0.9; // 10% скидка
        $price_html = wc_price($discounted_price);
    }
    return $price_html;
}

2. Обновление цены на фронтенде при выборе вариации

WooCommerce обновляет информацию о вариации через AJAX при выборе атрибутов, но в нашем случае нужно подправить вывод цены. Для этого добавим JavaScript, который перехватит событие выбора вариации и обновит цену с учётом скидки.

jQuery(function($) {
    $('.variations_form').on('found_variation', function(event, variation) {
        if (variation && variation.display_price) {
            var discountedPrice = variation.display_price * 0.9; // 10% скидка
            var formattedPrice = wc_price_format(discountedPrice);
            $('.woocommerce-variation-price .price').html(formattedPrice);
        }
    });

    function wc_price_format(price) {
        return '<span class="woocommerce-Price-amount amount">' +
            price.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$ ') + ' ₽</span>';
    }
});

Этот скрипт слушает событие found_variation, которое срабатывает после выбора вариации, и обновляет цену с учётом скидки.

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

  • Обновите страницу товара с вариациями.
  • Выберите разные варианты атрибутов.
  • Убедитесь, что цена меняется динамически и отображает новую стоимость с учётом скидки.
  • Проверьте, что цена на странице корзины и в админке осталась оригинальной — изменения касаются только отображения на фронтенде.

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

  • Цена не обновляется после выбора вариации: проверьте, подключен ли ваш JavaScript, нет ли конфликтов с другими скриптами, и что WooCommerce правильно инициализирует событие found_variation.
  • Цена изменяется и в корзине: фильтр woocommerce_get_price_html влияет только на отображение, но если цена меняется и в заказах, проверьте, не используете ли другие хуки для изменения цены товара.
  • Ошибка форматирования цены: используйте стандартные функции WooCommerce для форматирования цен, например wc_price(), чтобы избежать проблем с валютой и локализацией.

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

  • Не изменяйте цену товара в базе данных динамически, если хотите лишь визуально показать скидку — это может привести к ошибкам в заказах.
  • Если используете кэширование страницы, исключите страницы с товарами с вариациями или используйте AJAX для обновления цены.
  • Минимизируйте и объединяйте ваши скрипты, чтобы не создавать лишних запросов и не замедлять загрузку.

Сравнение вариантов реализации автоматического изменения цены

МетодПреимуществаНедостатки
Фильтр PHP (woocommerce_get_price_html)Прост в реализации, влияет только на отображениеНельзя изменить фактическую цену в корзине или заказе
JS обновление цены при выборе вариацииДинамическое обновление без перезагрузкиТребует дополнительного кода, может конфликтовать с плагинами
Изменение цены через хук woocommerce_before_calculate_totalsИзменяет цену товара в корзине и заказеСложнее, требует внимательности, чтобы не сломать расчёты
Как удалить или отключить плагин в WordPress правильно
05.11.2025
Как избежать проблем с кешем при разработке плагинов WordPress
16.04.2026
Как создать динамические блоки Gutenberg с применением React в WordPress
16.04.2026
WooCommerce: решение проблемы автоматического отключения корзины при добавлении товара
03.05.2026
Как правильно удалить мета-данные при удалении записи в WordPress
09.01.2026