WooCommerce: как отключить автоматический пересчет стоимости товаров в корзине

Диагностика проблемы: зачем отключать автоматический пересчет стоимости в корзине WooCommerce?

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

Основные признаки, что вам нужно отключить автоматический пересчет:

  • Медленная работа корзины при большом количестве товаров.
  • Пересчет стоимости конфликтует с кастомной логикой, например, скидками, модифицированными ценами.
  • Необходимо вручную контролировать момент пересчета (например, при AJAX-обновлениях).

Как работает автоматический пересчет в WooCommerce?

Пересчет происходит на стороне клиента и сервера, используя JavaScript и AJAX-запросы к REST API WooCommerce. Скрипты cart.js и обработчики в PHP вызывают пересчет при изменениях в корзине.

Чтобы отключить пересчет, нужно:

  • Отключить JavaScript-обработчики, вызывающие пересчет.
  • Блокировать серверные хуки, инициирующие обновление стоимости.

Пошаговое решение: отключение автопересчета стоимости

1. Отключение обновления корзины через JavaScript

Чтобы предотвратить автоматический пересчет на клиенте, можно отключить стандартный скрипт WooCommerce для обновления корзины через фильтр:

add_filter('woocommerce_cart_is_empty', '__return_true');

Однако этот фильтр влияет на определение пустой корзины, что не всегда подходит. Более точечное отключение требует переписывания JS, что сложно.

Лучший способ — отключить обновление корзины по событиям изменения количества товара с помощью удаления обработчиков jQuery:

function disable_woocommerce_cart_js() {
    if (is_cart()) {
        wp_dequeue_script('wc-cart');
    }
}
add_action('wp_enqueue_scripts', 'disable_woocommerce_cart_js', 99);

Это отключит стандартный скрипт, ответственный за динамическое обновление.

2. Отключение серверных хуков пересчета

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

remove_action('woocommerce_cart_updated', 'wc_cart_totals');
remove_action('woocommerce_cart_updated', 'woocommerce_calculate_totals');

Эти хуки встроены в WooCommerce, но удалять их напрямую не всегда безопасно. Вместо этого лучше использовать фильтр, который блокирует пересчет:

add_filter('woocommerce_cart_needs_payment', '__return_false');

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

3. Кастомный пример: отключение пересчета при изменении количества товаров

add_action('woocommerce_before_calculate_totals', 'prevent_automatic_recalculation', 1);
function prevent_automatic_recalculation($cart) {
    // Отключаем пересчет, если установлена сессия флага
    if (isset(WC()->session) && WC()->session->get('disable_cart_recalc')) {
        // Устанавливаем цены без изменений
        foreach ($cart->get_cart() as $cart_item) {
            $cart_item['data']->set_price($cart_item['data']->get_price());
        }
        // Прерываем дальнейший пересчет
        remove_action('woocommerce_before_calculate_totals', 'prevent_automatic_recalculation', 1);
    }
}

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

add_action('template_redirect', function() {
    if (is_cart()) {
        WC()->session->set('disable_cart_recalc', true);
    }
});

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

Для проверки, что автоматический пересчет отключен:

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

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

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

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

  • Отключайте автоматический пересчет только при необходимости: это может привести к расхождениям в суммах и негативно повлиять на UX.
  • Обязательно реализуйте понятный для пользователя интерфейс для ручного обновления корзины.
  • Тестируйте на всех этапах оформления заказа, чтобы убедиться, что итоговая стоимость соответствует ожиданиям.
  • Используйте кеширование AJAX-ответов и минимизируйте количество запросов для ускорения работы корзины.

Сравнение подходов отключения автопересчета

МетодПлюсыМинусыКогда использовать
Отключение JS-скрипта wc-cartПростота реализации
Остановка клиентского пересчета
Ломает динамическое обновление
Может конфликтовать с темой
Если нужен полный контроль над JS корзиной
Блокировка серверных хуков пересчетаПозволяет точечно управлять логикой
Минимальный эффект на фронтенд
Сложно реализовать без ошибок
Может вызвать ошибки в подсчете
При кастомных расчетах с серверной логикой
Использование сессии для отключения пересчетаГибко и масштабируемо
Можно включать/выключать динамически
Требует дополнительного кода
Необходима проверка состояния сессии
Для сложных кастомизаций с контролем над пересчетом
WooCommerce: как удалить товар из корзины без пересчета стоимости
17.06.2026
Как создать отзывы с оценками в WordPress
20.02.2026
WooCommerce: как использовать хуки для кастомизации корзины
04.06.2026
WooCommerce: как установить контроль размера изображений товаров в корзине
22.06.2026
WooCommerce: как отключить автоматический пересчет стоимости товаров в корзине
30.06.2026