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

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

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

Проверьте следующие моменты:

  • Как настроены налоги в WooCommerce: включена ли опция «Включать ли налоги в цены»;
  • Применяется ли скидка к цене товара с налогом или без;
  • Отображается ли итоговая сумма на странице корзины и оформления заказа корректно;
  • Используется ли кастомный код для изменения цены при применении промокода.

Как проверить текущий расчет скидки и налога

Для диагностики добавьте следующий код в файл functions.php вашей темы (желательно дочерней) или в плагин для кастомных функций. Этот код выведет в лог расчёт цены товара с учетом промокода и налога:

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

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $price_excl_tax = wc_get_price_excluding_tax( $product );
        $price_incl_tax = wc_get_price_including_tax( $product );
        error_log("Product ID: {$product->get_id()} - Price excl. tax: {$price_excl_tax} - Price incl. tax: {$price_incl_tax}");
    }
}

Затем примените промокод и проверьте, какие значения выводятся в debug.log (обычно в wp-content), чтобы понять, как WooCommerce рассчитывает цены с учетом скидок и налогов.

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

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

  1. Используйте фильтр woocommerce_before_calculate_totals для изменения цены в корзине.
  2. Изменяйте цену товара с учётом скидки, но до расчёта налогов WooCommerce.
  3. Обязательно корректно рассчитывайте цену с налогом, чтобы итоговая сумма была корректной.

Пример кода, который применит 10% скидку к товарам при условии наличия определённого промокода:

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

    // Проверяем, активен ли промокод
    $target_coupon = 'promo10'; // замените на ваш код
    $coupons = WC()->cart->get_applied_coupons();
    if ( ! in_array( $target_coupon, $coupons ) ) {
        return;
    }

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $original_price = $product->get_regular_price();

        // Применяем скидку 10%
        $discounted_price = $original_price * 0.9;

        // Устанавливаем новую цену
        $product->set_price( $discounted_price );
    }
}

Обратите внимание, что WooCommerce автоматически пересчитает налоги после изменения цены товара.

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

1. Очистите кеш WooCommerce и браузера.

2. Добавьте товар в корзину и примените промокод promo10.

3. На странице корзины проверьте:

  • Цена товара изменилась на 10% меньше от оригинальной цены.
  • Налог рассчитан корректно с учетом новой цены.
  • Итоговая сумма корзины соответствует ожиданиям.

4. Оформите заказ, чтобы убедиться, что сумма на странице оформления заказа и в письмах соответствует правильным расчетам.

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

  • Цена товара не меняется после применения промокода. Причина: функция не срабатывает из-за приоритета хука или ошибки в условии. Проверьте, что хук woocommerce_before_calculate_totals используется с приоритетом не выше 20 и функция не возвращает преждевременно.
  • Налоги считаются некорректно. Причина: изменение цены происходит после расчета налогов. Решение — менять цену именно в woocommerce_before_calculate_totals, до расчёта налогов WooCommerce.
  • Конфликт с другими плагинами скидок. Проверьте, что нет повторного применения скидок, либо используйте проверку по промокоду как в примере.

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

  • Избегайте частого вызова функции изменения цены без проверки промокода — это снизит нагрузку.
  • Закладывайте в код проверку, что он не выполняется в админке (кроме AJAX), чтобы не влиять на административные операции.
  • Используйте префиксы и уникальные имена функций, чтобы избежать конфликтов с другими плагинами.
  • Всегда тестируйте изменения на тестовом сайте перед применением на боевом.

Сравнение вариантов реализации скидок в WooCommerce

МетодОписаниеПлюсыМинусы
Использование стандартных купонов WooCommerceПрименение скидок через админку WooCommerceПростота, интеграция с отчетамиОграниченные возможности кастомизации
Кастомное изменение цены через хук woocommerce_before_calculate_totalsИзменение стоимости в зависимости от условийГибкость, точечное управлениеТребуется программирование, риски ошибок
Плагины для скидок и промокодовРасширенные возможности скидокБольшой функционал без кодаНагрузка на сайт, возможны конфликты
Как установить ограничения на регистрацию в WordPress по домену и email
17.03.2026
Как использовать хуки в WordPress: практическое руководство
10.11.2025
Как автоматизировать обновление публикаций в WordPress с помощью WP-Cron
27.02.2026
Как добавить автоматическое удаление старых комментариев в WordPress
04.03.2026
Как создать автоматический бэкап базы данных WordPress
03.04.2026