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

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

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

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

  • Купон создан и активен в WooCommerce;
  • Он применяется корректно и отображается в корзине;
  • Стандартные скидки работают, но кастомное поведение отсутствует.

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

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

Пошаговое решение

  1. Добавьте следующий код в файл functions.php вашей активной темы или в кастомный плагин.
  2. В коде замените 'SPECIAL10' на ваш код купона.
  3. Укажите ID товара, цену которого нужно изменить.
  4. Задайте новую цену для товара при активном купоне.
add_action('woocommerce_before_calculate_totals', 'custom_change_price_with_coupon', 20, 1); 
function custom_change_price_with_coupon( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    // Код купона, который должен быть применён
    $target_coupon = 'SPECIAL10';
    // ID товара, цену которого нужно изменить
    $target_product_id = 123;
    // Новая цена товара
    $new_price = 499;

    // Проверяем, что купон применён
    $coupons = WC()->cart->get_applied_coupons();
    if ( ! in_array( strtolower($target_coupon), $coupons ) ) return;

    // Итерируем товары в корзине
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] == $target_product_id ) {
            $cart_item['data']->set_price( $new_price );
        }
    }
}

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

  • Создайте купон с кодом SPECIAL10 в WooCommerce (или замените на ваш код в коде).
  • Добавьте в корзину товар с ID 123 (можно узнать ID через админку или в списке товаров).
  • Примените купон в корзине.
  • Цена товара должна измениться на заданную (499 в примере) сразу после применения купона и обновления корзины.

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

  • Купон не применяется: Проверьте, что купон активен, не истек и не имеет ограничений по продуктам или пользователям.
  • Цена не меняется: Убедитесь, что ID товара указан правильно, а хук подключен без ошибок.
  • Изменения цены не отображаются в админке: Изменения цены в корзине не влияют на базовую цену товара в админке — это нормальное поведение.
  • Конфликты с другими плагинами скидок: Отключите сторонние плагины скидок для теста или уточните приоритет хука.

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

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

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

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

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

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

МетодПреимуществаНедостатки
Стандартные купоны WooCommerceПростота использования, без кодаОграниченные сценарии скидок
Кастомный хук woocommerce_before_calculate_totalsГибкость, можно менять цену по сложным условиямТребует навыков разработки, возможны конфликты
Плагины для персональных скидокГотовые решения с расширенным функционаломМогут быть дорогими, увеличивают нагрузку
Как исправить проблемы с кеширующими плагинами в WooCommerce
31.05.2026
Как отключить Emoji в WordPress для ускорения сайта
15.03.2026
Как вывести правильное изображение товара в WooCommerce при использовании вариаций
20.04.2026
Как избежать конфликтов между плагинами в WordPress
22.01.2026
Как найти и убрать дубли страниц в WordPress
14.08.2026