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

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

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

  • Неправильное использование хуков WooCommerce для изменения цены.
  • Отсутствие вызова функции пересчёта стоимости в корзине после применения промокода.
  • Конфликт с другими плагинами, которые переопределяют цены.
  • Кэширование страниц или корзины, мешающее обновлению цены.

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

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

1. Добавление функции для изменения цены в functions.php

Вставьте следующий код в файл 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;
    // Проверяем, применён ли конкретный промокод
    $target_coupon = 'specialdiscount'; // замените на ваш промокод
    $applied_coupons = WC()->cart->get_applied_coupons();
    if ( ! in_array( $target_coupon, $applied_coupons ) ) {
        return;
    }
    // Перебираем товары в корзине
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        // Устанавливаем новую цену
        $original_price = $cart_item['data']->get_price();
        $new_price = $original_price * 0.9; // скидка 10%
        $cart_item['data']->set_price( $new_price );
    }
}

2. Очистка кэша и проверка работы

После добавления кода очистите кэш сайта и браузера, обновите корзину. Для проверки:

  • Добавьте товар в корзину.
  • Примените промокод specialdiscount (или ваш собственный).
  • Убедитесь, что цена товара изменилась на 10% ниже оригинальной.

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

Для проверки корректности работы функции:

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

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

  • Цена не меняется при применении промокода: проверьте, совпадает ли название промокода в коде с реальным.
  • Цена меняется для всех товаров, даже без промокода: убедитесь, что проверка промокода (in_array()) стоит до изменения цены.
  • Ошибка с кэшированием: очистите кэш сайта и отключите плагины кеширования на время тестирования.
  • Изменение цены не учитывается в итогах: используйте приоритет 20 в хуке, чтобы изменения применялись до расчёта итогов.

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

  • Не изменяйте цену напрямую в базе данных, используйте API WooCommerce для корректного учета.
  • Проверяйте, что функция не выполняется в административной области, чтобы избежать ошибок.
  • Оптимизируйте код, чтобы не перебирать корзину без необходимости.
  • Тестируйте на staging-сайте перед внедрением в продакшен.

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

МетодОписаниеПлюсыМинусы
Использование хука woocommerce_before_calculate_totalsИзменение цены через API WooCommerce в корзинеГибко, без сторонних плагинов, точечное управлениеТребует знаний PHP, возможны ошибки без тестирования
Плагины скидок и промокодовГотовые решения для управления скидкамиПростота использования, поддержкаМожет влиять на производительность, ограничения кастомизации
Изменение цены на уровне базы данныхПрямое обновление цены товараМгновенное изменениеНебезопасно, может сломать логику WooCommerce

Дополнительный пример кода: изменение цены только для определённой категории товаров

add_action('woocommerce_before_calculate_totals', 'change_price_for_category_on_coupon', 20, 1);
function change_price_for_category_on_coupon( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;
    $target_coupon = 'specialdiscount';
    if ( ! in_array( $target_coupon, WC()->cart->get_applied_coupons() ) ) return;
    foreach ( $cart->get_cart() as $cart_item ) {
        if ( has_term( 'sale-category', 'product_cat', $cart_item['product_id'] ) ) {
            $price = $cart_item['data']->get_price();
            $cart_item['data']->set_price( $price * 0.85 ); // скидка 15%
        }
    }
}
WooCommerce: решение проблемы не обновляющегося SKU вариаций товаров
04.06.2026
WooCommerce: автоматическое изменение цены товара при выполнении условий без плагинов
15.06.2026
WooCommerce: решение проблемы нерабочей функции динамического изменения цены товара при промокодах
31.05.2026
Как автоматически удалить пустые категории в WordPress
07.04.2026
Как добавить уникальное поле в форму регистрации WordPress
16.02.2026