В WooCommerce путаница с налогом обычно появляется не из-за самого расчёта, а из-за того, как магазин показывает цены в каталоге, карточке товара, корзине и на странице оформления заказа. На практике это выглядит так: в админке цена введена одна, покупатель видит другую, а в корзине сумма меняется после ввода адреса. Если не понять, где именно ломается логика, можно долго искать ошибку не в том месте.
Когда проблема действительно в настройках налога
Сначала стоит отделить ошибку конфигурации от конфликта с темой или плагином. В WooCommerce налог считается на основе нескольких параметров: базовой цены товара, настроек отображения цен, налогового класса, адреса покупателя и того, включён ли расчёт налога для доставки. Если хотя бы один из этих пунктов настроен не так, поведение магазина будет казаться случайным.
Типичные симптомы
- цена в каталоге отображается с НДС, а в корзине — без него;
- в карточке товара сумма одна, но после перехода в checkout меняется;
- налог не добавляется к доставке, хотя вы ожидаете обратное;
- в админке заказ выглядит корректно, а клиент получает письмо с другой суммой;
- после смены страны или индекса сумма налога пересчитывается не так, как ожидалось.
Что проверить в первую очередь
- включён ли налог в WooCommerce → Настройки → Общие;
- как задано отображение цен в каталоге — с налогом или без;
- как задано отображение цен в корзине и на странице оформления заказа;
- какой налоговый класс назначен товару;
- есть ли налоговые ставки в WooCommerce → Настройки → Налог;
- не переопределяет ли тему шаблоны cart/checkout.
Как WooCommerce считает налог и где это настраивается
Важный момент: WooCommerce не хранит «налог» как одну фиксированную величину для всех случаев. Он рассчитывается по ставкам, которые вы задаёте вручную или импортируете. Поэтому сначала нужно решить, вы показываете цены с налогом или без налога, а уже потом настраивать отображение в корзине.
| Подход | Что видит покупатель | Плюсы | Минусы |
|---|---|---|---|
| Цены с налогом в каталоге | Сразу итоговая цена | Меньше вопросов от клиента | Сложнее сравнивать базовую цену |
| Цены без налога в каталоге | Налог добавляется позже | Удобно для B2B и разных ставок | Нужна понятная подпись и аккуратный checkout |
| Смешанный режим через код | Зависит от условий | Гибко для отдельных ролей и стран | Легко сломать расчёт при обновлениях |
Если магазин обычный, без сложной логики по ролям и регионам, лучше не усложнять. Большинство проблем решается штатными настройками WooCommerce и корректными налоговыми ставками.
Пошаговая настройка отображения налога
1. Включите налог и задайте базовый режим цен
Откройте WooCommerce → Настройки → Общие и проверьте, включён ли налог. Затем перейдите в раздел Налог. Если вкладка не видна, значит расчёт налога не активирован.
Дальше выберите, как хранится цена товара:
- цены введены с налогом — если в админке вы уже указываете конечную цену для покупателя;
- цены введены без налога — если налог должен добавляться отдельно на витрине и в корзине.
Это решение влияет на всё остальное. Если ошибиться здесь, потом можно долго править ставки, но итоговая сумма всё равно будет выглядеть неверно.
2. Настройте отображение в каталоге и корзине
В настройках налога есть отдельные параметры для витрины и checkout. Для магазина важно, чтобы логика была одинаковой: если в каталоге цена показывается с налогом, то и в корзине покупатель не должен внезапно видеть другую базу без пояснения.
Практически это выглядит так:
- для B2C-магазина чаще выбирают отображение цен с налогом;
- для B2B — без налога, но с явной строкой о налоге в корзине;
- если у вас несколько стран, проверьте, как работает расчёт по адресу доставки.
3. Проверьте налоговые ставки
В WooCommerce → Настройки → Налог добавьте ставки для нужных стран и регионов. Для проверки достаточно одной тестовой ставки, но она должна соответствовать реальному сценарию. Если ставка не совпадает с адресом покупателя, WooCommerce просто не применит её.
Обратите внимание на поля:
- страна;
- область/регион;
- почтовый индекс;
- город;
- ставка;
- название налога.
Если нужно изменить подпись налога в корзине
Иногда проблема не в расчёте, а в тексте. Например, WooCommerce показывает строку Tax или слишком общую подпись, а вам нужно более понятное название. Это можно сделать через фильтр woocommerce_cart_totals_taxes_total_html или через шаблон, но шаблон — более хрупкий путь. Для простой замены текста лучше использовать фильтр и не трогать шаблоны темы.
<?php
add_filter( 'woocommerce_cart_totals_taxes_total_html', function( $tax_html ) {
if ( is_admin() ) {
return $tax_html;
}
// Пример: меняем только текстовую часть, если она есть в выводе.
$tax_html = str_replace( 'Tax', 'Налог', $tax_html );
return $tax_html;
} );Такой вариант годится только если вы точно понимаете, что именно выводит ваша тема и локализация. Если WooCommerce уже переведён, заменять строку через str_replace не всегда удобно. В этом случае лучше проверить перевод через плагин локализации или не вмешиваться в HTML-вывод без необходимости.
Если налог должен считаться по адресу покупателя
Для магазинов с разными ставками по регионам важно, чтобы WooCommerce брал адрес не из профиля администратора, а из данных клиента в корзине и checkout. Если этого не происходит, обычно причина в том, что магазин настроен считать налог по адресу магазина, а не по адресу доставки или биллинга.
Проверьте, какой адрес выбран как база расчёта:
- адрес магазина;
- адрес доставки клиента;
- адрес выставления счёта.
Для большинства интернет-магазинов логичнее считать налог по адресу доставки, но это зависит от вашей юрисдикции и бизнес-процесса. Здесь не стоит полагаться на «как обычно делают» — лучше сверить с вашей бухгалтерской схемой.
Пример: показать цену с налогом только на витрине
Иногда нужно, чтобы в каталоге и карточке товара цена была с налогом, а в корзине и checkout — разбивка по строкам. Это можно сделать без переопределения шаблонов, если аккуратно использовать фильтры отображения цены.
<?php
add_filter( 'woocommerce_get_price_html', function( $price_html, $product ) {
if ( is_admin() || ! $product instanceof WC_Product ) {
return $price_html;
}
if ( is_cart() || is_checkout() ) {
return $price_html;
}
$price = wc_get_price_including_tax( $product );
return wc_price( $price );
}, 10, 2 );Это пример для понимания механики, а не универсальный рецепт. Если у товара есть вариации, скидки или динамическое ценообразование, сначала тестируйте на staging-сайте. Неправильный фильтр может сломать отображение акций и диапазонов цен.
Проверка результата после внедрения
После настройки не ограничивайтесь просмотром страницы товара в браузере. Нужно проверить весь путь: каталог, карточку, корзину, checkout и письмо с заказом. Иначе можно пропустить ситуацию, когда витрина выглядит нормально, а итоговая сумма в заказе считается иначе.
Чек-лист проверки
- цена в каталоге совпадает с выбранным режимом налога;
- в карточке товара сумма отображается так же, как в каталоге;
- в корзине налог добавляется или скрывается по вашей логике;
- при смене адреса пересчёт происходит ожидаемо;
- в заказе в админке сумма налога совпадает с checkout;
- в email покупателю выводятся те же значения, что и на странице оформления;
- для тестового товара с другим налоговым классом расчёт отличается от базового.
Полезно проверить это в двух сценариях: с адресом внутри вашей налоговой зоны и с адресом вне её. Так вы сразу увидите, применяются ли ставки корректно.
Частые ошибки и как их исправить
Ставка есть, но налог не считается
Обычно причина в несовпадении адреса. Ставка может быть задана для страны и региона, а покупатель вводит другой индекс или город. Ещё одна частая причина — товару назначен не тот налоговый класс.
Цена в каталоге и корзине отличается без объяснения
Это почти всегда следствие смешанного режима: в одном месте цена показывается с налогом, в другом — без него. Проверьте настройки отображения и не пытайтесь «лечить» это только CSS-ом или правкой шаблона.
Налог не применяется к доставке
Здесь нужно отдельно проверить, включён ли расчёт налога для доставки в настройках WooCommerce. Если доставка должна облагаться налогом, но строка не меняется, проблема часто в том, что способ доставки не поддерживает нужную схему или в магазине используется кастомная логика.
После обновления темы сломался вывод
Если вы правили шаблоны cart/checkout вручную, обновление темы могло перезаписать изменения. Для таких задач лучше использовать дочернюю тему или фильтры, а не менять файлы родительской темы напрямую.
Что делать, если нужна более сложная логика
Если налог зависит от роли пользователя, страны, категории товара или типа доставки, штатных настроек может быть недостаточно. Тогда есть два рабочих пути: специализированный плагин для налогов или собственный код. Плагин проще сопровождать, код даёт больше контроля, но требует тестов после каждого обновления WooCommerce.
Для сложных магазинов разумно сначала описать правила на бумаге: кто, где и при каких условиях видит цену с налогом. После этого уже выбирать реализацию. Иначе легко получить схему, которую невозможно поддерживать без постоянных ручных правок.
Практические советы по безопасности и производительности
- не правьте ядро WooCommerce — используйте настройки, фильтры или дочернюю тему;
- перед изменениями делайте копию сайта или работайте на staging;
- не добавляйте тяжёлые вычисления в фильтры цены на каждом запросе;
- если используете кастомный код, храните его в мини-плагине, а не в functions.php темы;
- после правок очистите кэш страницы и объектный кэш, если он есть;
- проверьте, не конфликтует ли плагин валют с налоговыми расчётами.
Если на сайте уже много технических плагинов, полезно отдельно проверить, не дублируют ли они друг друга. Для чистки лишних функций и отключения ненужных модулей иногда удобен Clearfy Pro, но только если вы понимаете, что именно отключаете и как это влияет на WooCommerce-страницы.
Когда налоговая логика уже настроена, не забудьте прогнать тестовый заказ до конца: товар, корзина, checkout, письмо, заказ в админке. Именно на этом этапе чаще всего всплывают расхождения, которые не видны в каталоге.