WooCommerce: исправляем ошибки округления цен после скидок

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

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

Основные симптомы:

  • Цена со скидкой отличается на пару копеек между страницей товара и корзиной.
  • Сумма заказа не совпадает с суммой отдельных товаров.
  • Неправильное отображение налогов и итоговой суммы.

Причина чаще всего в несогласованности настроек округления в WooCommerce и PHP, а также в способе вычисления скидок (процентных или фиксированных).

Как проверить проблему

  • Создайте тестовый товар с ценой, содержащей дробную часть (например, 199.99).
  • Примените процентную скидку (например, 15%).
  • Проверьте цену на странице товара, в корзине и на странице оформления заказа.
  • Сравните сумму скидки и итоговую стоимость с ожидаемыми, учитывая округление до двух знаков.

Пошаговое решение проблемы округления цен после скидок

1. Установите единообразное количество знаков после запятой

Перейдите в WooCommerce > Настройки > Общие и убедитесь, что количество десятичных знаков установлено в 2. Это влияет на отображение цен, но не всегда на вычисления.

2. Принудительно округляйте цены и скидки в коде

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

add_filter('woocommerce_get_price_html', 'fix_price_rounding_display', 100, 2);
function fix_price_rounding_display($price_html, $product) {
    $price = floatval($product->get_price());
    $rounded_price = number_format($price, 2, '.', '');
    return wc_price($rounded_price);
}

add_filter('woocommerce_cart_item_price', 'fix_cart_item_price_rounding', 100, 3);
function fix_cart_item_price_rounding($price, $cart_item, $cart_item_key) {
    $product = $cart_item['data'];
    $price_raw = $product->get_price();
    $rounded_price = number_format((float)$price_raw, 2, '.', '');
    return wc_price($rounded_price);
}

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

3. Контролируйте округление в вычислении скидок

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

add_action('woocommerce_cart_calculate_fees', 'custom_discount_rounding', 20);
function custom_discount_rounding($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    $discount_percentage = 10; // например, 10%
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $price = $cart_item['data']->get_price();
        $discount_amount = round($price * $discount_percentage / 100, 2); // округляем
        $new_price = $price - $discount_amount;
        $cart_item['data']->set_price($new_price);
    }
}

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

  • Добавьте товар с дробной ценой в корзину.
  • Примените скидку или купон.
  • Убедитесь, что цена товара и итоговая сумма в корзине совпадают с ручным расчетом с округлением до 2 знаков.
  • Проверьте отображение цен на страницах товара, корзины и оформления заказа.
  • Используйте консоль разработчика и логи WooCommerce для отладки значений цен.

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

  • Несогласованность настроек округления WooCommerce и PHP: Проверьте, что в PHP.ini установлена локаль и настройки чисел не конфликтуют с WooCommerce (например, decimal_point должен быть ".").
  • Округление только при выводе, а не при вычислениях: Округляйте значения сразу после вычислений, а не только при выводе.
  • Использование плавающей арифметики без округления: В PHP при операциях с float может быть потеря точности — используйте функции round() и number_format().
  • Кэширование старых значений цен: Очистите WooCommerce и браузерный кэш после внесения изменений.

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

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

Сравнение способов решения проблемы округления

СпособПреимуществаНедостаткиПример кода
Настройки WooCommerce Просто настроить, влияет на отображение Не гарантирует корректность вычислений В админке
Округление в фильтрах вывода Исправляет отображение цен Не исправляет внутренние расчёты Фильтр woocommerce_get_price_html
Округление при вычислении скидок в хуках Гарантирует корректные суммы и отображение Требует программирования, возможны ошибки Хук woocommerce_cart_calculate_fees
Как создать адаптивный фильтрованный запрос в WordPress для больших объемов данных
22.12.2025
Как защитить WPData от неавторизованного доступа: лучшие практики и примеры
13.04.2026
Как создать и использовать собственный тип данных в WordPress
22.02.2026
Запросы и ответы в WordPress — практические примеры и оптимизация
02.12.2025
WooCommerce: решение проблемы с неотображением корзины при AJAX-обновлении
24.05.2026