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

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

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

Как понять, что нужна именно автоматическая замена цены товара, а не просто скидка? Если клиент применяет купон, и цена товара должна измениться на определённую сумму или процент только в корзине и на странице заказа — необходим кастомный код.

Пошаговое решение: изменение цены товара при применении купона с помощью хука woocommerce_before_calculate_totals

1. Определяем купон и товар

Для примера предположим, что у нас есть купон с кодом special10, и мы хотим, чтобы при его применении цена всех товаров с ID 1234 уменьшалась на 10%.

2. Добавляем фильтр в файл functions.php вашей темы или в кастомный плагин

add_action('woocommerce_before_calculate_totals', 'custom_change_price_on_coupon', 20, 1);
function custom_change_price_on_coupon($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    // Проверяем, применён ли купон
    $applied_coupons = WC()->cart->get_applied_coupons();
    if (!in_array('special10', $applied_coupons)) {
        return;
    }

    // Проходим по товарам в корзине
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        // Проверяем ID товара
        if ($cart_item['product_id'] == 1234) {
            $original_price = $cart_item['data']->get_regular_price();
            // Уменьшаем цену на 10%
            $new_price = $original_price * 0.9;
            $cart_item['data']->set_price($new_price);
        }
    }
}

Как проверить, что решение сработало

  • Добавьте купон special10 в WooCommerce с типом «Без скидки» или любой, чтобы он применялся без конфликта.
  • Положите в корзину товар с ID 1234 (узнать ID можно в админке или на странице товара в URL).
  • Перейдите в корзину и примените купон.
  • Цена товара должна измениться на 10% меньше оригинала.
  • Убедитесь, что цена корректно отображается на странице оформления заказа и в уведомлениях.

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

  • Купон не применяется: проверьте, что код купона совпадает с тем, что указан в коде (special10), и что он активен.
  • Цена не меняется: убедитесь, что ID товара правильный, а функция set_price() вызывается именно на объекте продукта внутри корзины.
  • Изменённая цена сохраняется после удаления купона: если цена не сбрасывается, проверьте, что в функции есть условие, отменяющее изменение при отсутствии купона.
  • Изменение цены влияет на все товары: добавьте проверку по ID или категории товара, чтобы ограничить действие.

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

  • Не используйте этот код для изменения цен вне корзины — это может привести к рассогласованию данных.
  • Применяйте оптимизацию: хук woocommerce_before_calculate_totals должен быть с приоритетом не ниже 20, чтобы другие плагины успевали сработать.
  • Если нужно менять цены для большого числа товаров, лучше использовать категории или мета-поля, а не проверять по ID каждого товара вручную.
  • Тестируйте изменения на staging-сервере, особенно если у вас есть кеширующие плагины или CDN, чтобы избежать кэширования старых цен.

Таблица сравнения способов изменения цены при применении купона

СпособПлюсыМинусыКогда использовать
Стандартные купоны WooCommerce Простота использования, поддержка UI Ограниченная гибкость, нельзя менять цену товара программно Когда нужна простая скидка в процентах или сумме
Код с хуком woocommerce_before_calculate_totals Гибкость, можно менять цену динамически Требует программирования, потенциальные ошибки при неправильной логике Когда нужна кастомная логика изменения цены под купон
Плагины с расширенным управлением скидками Много функций, поддержка UI Может замедлять сайт, требует лицензии Для сложных акций без собственной разработки
WooCommerce: автоматическое изменение цены товара при применении купона
08.06.2026
Как сделать автоматическое открытие попап окна в WordPress при загрузке страницы
06.01.2026
WooCommerce: автоматическое отключение кэширующих плагинов для корректной работы корзины
31.07.2026
WooCommerce: автоматическое изменение стоимости товара при применении купона
18.07.2026
Почему не работают купоны в WooCommerce и как это исправить
04.06.2026