Диагностика проблемы: почему WooCommerce автоматически обновляет корзину
По умолчанию WooCommerce при изменении атрибутов товаров (например, цвета, размера) или количества в корзине пересчитывает и обновляет её содержимое с помощью AJAX. Это может приводить к нежелательным эффектам: перезагрузке блока корзины, потере пользовательских данных или конфликтам с кастомными скриптами.
Если вы хотите отключить это поведение, нужно понять, какие именно AJAX-события вызывают обновление, и корректно их отменить.
Как проверить, что происходит автоматическое обновление
- Откройте консоль браузера (F12) и перейдите во вкладку "Сеть" (Network).
- При изменении количества или атрибутов товара в корзине посмотрите, какие AJAX-запросы отправляются. Обычно это запросы к
/?wc-ajax=update_cartили/?wc-ajax=get_refreshed_fragments. - Если они выполняются, значит WooCommerce инициирует обновление корзины.
Пошаговое решение: отключение автоматического обновления корзины
Для отключения автоматического обновления корзины можно переопределить JS-обработчики WooCommerce и отменить вызовы обновления корзины. Сделаем это через добавление кастомного скрипта в тему или плагин.
Шаг 1. Отключаем обновление фрагментов корзины
WooCommerce использует JS-функцию wc_fragments_refresh для обновления блока корзины. Чтобы её отключить, добавим код:
jQuery( function($) {
// Отключаем автоматическое обновление фрагментов
$( document.body ).off( 'updated_wc_div' );
$( document.body ).off( 'wc_fragments_refreshed' );
// Отключаем вызов обновления фрагментов после изменения корзины
$( document.body ).off( 'updated_cart_totals' );
$( document.body ).off( 'update_cart_totals' );
});Шаг 2. Отключаем обработчики изменения количества и атрибутов
WooCommerce навешивает обработчики на изменения полей количества и атрибутов, вызывая обновление корзины. Чтобы их отключить, нужно убрать эти обработчики:
jQuery( function($) {
// Отключаем обработчики изменения количества
$( document.body ).off( 'change', '.qty' );
// Отключаем обновление при смене варианта товара
$( document.body ).off( 'change', 'select' );
});Шаг 3. Подключаем скрипт правильно
Добавьте следующий PHP-код в functions.php вашей темы или в кастомный плагин, чтобы подключить кастомный JS только на страницах корзины и оформления заказа:
function disable_wc_auto_update_cart() {
if ( is_cart() || is_checkout() ) {
wp_add_inline_script( 'wc-cart-fragments', "
jQuery(function($){
$(document.body).off('updated_wc_div wc_fragments_refreshed updated_cart_totals update_cart_totals');
$(document.body).off('change', '.qty');
$(document.body).off('change', 'select');
});
" );
}
}
add_action( 'wp_enqueue_scripts', 'disable_wc_auto_update_cart', 20 );Проверка результата после внедрения
- Обновите страницу корзины в режиме инкогнито, чтобы сбросить кэш.
- Измените количество товара или выберите другой вариант.
- Откройте вкладку "Сеть" в консоли браузера и убедитесь, что AJAX-запросы
update_cartиget_refreshed_fragmentsне отправляются. - Проверьте, что содержимое корзины не обновляется автоматически и не исчезают пользовательские данные.
Частые ошибки и как их исправить
- Скрипт не отключает обновление корзины
Причина: скрипт подключается не на тех страницах или слишком рано. Проверьте условиеis_cart() || is_checkout()и приоритет подключения (должен быть >= 20). - Конфликты с другими плагинами, которые тоже обновляют корзину
Решение: используйте консоль браузера, чтобы определить, какие скрипты вызывают обновление, и отключите их аналогично. - Пользователь не видит обновлённое количество товаров
Если отключить автоматическую перезагрузку, нужно самому реализовать кнопку "Обновить корзину" с отправкой формы, чтобы сохранить корректность данных.
Практические советы по производительности и безопасности
- Отключение автоматического обновления корзины уменьшит число AJAX-запросов, что положительно скажется на производительности при большом трафике.
- Не отключайте обновление корзины полностью, если у вас сложные вариативные товары с динамическими ценами — это может привести к некорректным данным у пользователей.
- Обязательно тестируйте изменения на staging-сайте перед внедрением в продакшен.
Сравнение вариантов решения
| Метод | Преимущества | Недостатки |
|---|---|---|
| Отключение JS-обработчиков (код выше) | Быстрое решение, снижает AJAX-запросы | Может нарушить UX, нужно реализовать кнопку обновления |
| Использование плагина для управления корзиной | Простота настройки, готовые функции | Дополнительная нагрузка, возможны конфликты |
| Кастомная логика обновления корзины через REST API | Полный контроль над процессом | Сложно реализовать, требует разработки |