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

Проблема: необходимость автоматической смены ставки НДС в WooCommerce

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

Диагностика проблемы

Чтобы понять, почему ставка НДС не меняется автоматически, нужно проверить следующие моменты:

  • Правильно ли настроены налоговые классы в WooCommerce: WooCommerce > Настройки > Налоги.
  • Присвоены ли товары нужным налоговым классам.
  • Активно ли в настройках налогообложение и правильно ли указан регион налогобложения.
  • Отсутствуют ли конфликтующие плагины, которые могут переопределять цену или ставку налога.

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

Пошаговое решение: добавление автоизменения ставки НДС через хук WooCommerce

WooCommerce позволяет изменять налоговую ставку с помощью фильтра woocommerce_product_get_tax_class. Используем этот фильтр, чтобы менять налоговый класс товара в зависимости от условий.

Пример: меняем ставку НДС для товаров из категории "Экспорт" (без НДС)

add_filter('woocommerce_product_get_tax_class', 'custom_change_tax_class_based_on_category', 10, 2);
function custom_change_tax_class_based_on_category( $tax_class, $product ) {
    if ( has_term( 'export', 'product_cat', $product->get_id() ) ) {
        // Для товаров с категорией 'export' используем налоговый класс 'zero-rate'
        return 'zero-rate';
    }
    return $tax_class;
}

В данном примере:

  • has_term() проверяет, относится ли товар к категории с ярлыком export.
  • Возвращается налоговый класс zero-rate, который должен быть предварительно создан в настройках WooCommerce с нулевой ставкой НДС.

Пример: меняем ставку НДС в зависимости от страны покупателя

add_filter('woocommerce_product_get_tax_class', 'custom_tax_class_by_customer_location', 10, 2);
function custom_tax_class_by_customer_location( $tax_class, $product ) {
    if ( is_admin() ) return $tax_class; // Не меняем в админке

    $customer = WC()->customer;
    if ( ! $customer ) return $tax_class;

    $country = $customer->get_billing_country();

    if ( $country === 'DE' ) { // Германия — ставка 19%
        return 'standard';
    } elseif ( $country === 'FR' ) { // Франция — ставка 20%
        return 'french-rate';
    }
    return $tax_class;
}

Обратите внимание:

  • Налоговые классы standard и french-rate должны быть созданы в WooCommerce с нужными ставками.
  • Код учитывает страну выставления счета покупателя.

Проверка результата

После внедрения кода:

  1. Очистите кеш сайта и браузера.
  2. Перейдите на страницу товара, относящегося к категории export (для первого примера) или измените адрес доставки в корзине на нужную страну (для второго).
  3. Проверьте, что цена товара отображается с корректным налогом — в чеке и на странице товара.
  4. В админке WooCommerce проверьте расчёт налогов в заказах.

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

  • Налоговый класс не создан в WooCommerce: убедитесь, что в WooCommerce > Настройки > Налоги > Налоговые классы есть нужные классы с корректными ставками.
  • Кэширование мешает обновлению цены: отключите плагины кеширования на время тестирования или очистите кеш.
  • Код не срабатывает в административной части: добавьте проверку is_admin(), чтобы избежать ошибок в админке.
  • Неверно указана категория товара: проверьте slug категории, используемой в has_term().
  • Функция вызывается до инициализации WC()->customer: код нужно запускать, когда сессия пользователя уже определена — обычно фильтр работает корректно.

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

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

Сравнение способов изменения ставки НДС в WooCommerce

МетодПлюсыМинусыПример
Настройка налоговых классов по категориямПростота, без кодаОграниченная гибкостьВручную в админке
Фильтр woocommerce_product_get_tax_classГибкая автоматизацияТребуется код и тестированиеПримеры в статье
Плагины налогообложения (например, WooCommerce Tax)Широкий функционал, поддержкаСтоимость и нагрузка на сайтПлатные решения
WooCommerce: автоматическое отключение способа оплаты при отсутствии товара на складе
04.07.2026
Как отключить XML-RPC в WordPress и не сломать удалённые подключения
13.08.2026
Как автоматически отключить кнопку «Добавить в корзину» в WooCommerce при отсутствии товара
24.04.2026
Как автоматически изменять атрибуты варианта товара в WooCommerce при изменении запаса
22.05.2026
Как автоматически отключить XML-RPC в WordPress для повышения безопасности
06.04.2026