Диагностика проблемы с AJAX корзиной WooCommerce
Типичная задача при кастомизации WooCommerce — отключить стандартную AJAX корзину и заменить её на собственную реализацию. Это нужно, если стандартное поведение корзины вызывает конфликты с темой, тормозит сайт или неудобно для UX.
Проверьте, действительно ли используется AJAX обновление корзины. Для этого добавьте товар в корзину и посмотрите, обновляется ли количество товаров и сумма без перезагрузки страницы. Если да, значит AJAX работает.
Также проверьте консоль браузера на наличие ошибок JavaScript и сеть (Network) на запросы к wc-ajax=get_refreshed_fragments. Если запросы идут и обновления есть — стандартная AJAX корзина активна.
Пошаговое решение: удаление и замена AJAX корзины WooCommerce
1. Отключаем стандартное обновление AJAX корзины
Для отключения AJAX обновления корзины добавьте следующий код в functions.php вашей темы или дочерней темы:
add_filter('woocommerce_add_to_cart_fragments', '__return_empty_array');Этот фильтр отключит обновление фрагментов корзины, которое отвечает за AJAX обновление.
2. Убираем скрипт AJAX корзины
Стандартный скрипт WooCommerce, ответственный за AJAX корзину, называется wc-cart-fragments. Его можно отключить так:
function disable_woocommerce_cart_fragments() {
wp_dequeue_script('wc-cart-fragments');
}
add_action('wp_enqueue_scripts', 'disable_woocommerce_cart_fragments', 11);3. Реализуем собственную AJAX корзину
Создадим простой пример замены корзины на AJAX без стандартного фрагмента:
В файле functions.php добавьте обработчик AJAX:
add_action('wp_ajax_my_custom_add_to_cart', 'my_custom_add_to_cart');
add_action('wp_ajax_nopriv_my_custom_add_to_cart', 'my_custom_add_to_cart');
function my_custom_add_to_cart() {
$product_id = intval($_POST['product_id']);
$quantity = isset($_POST['quantity']) ? intval($_POST['quantity']) : 1;
if ($product_id > 0) {
$added = WC()->cart->add_to_cart($product_id, $quantity);
if ($added) {
wp_send_json_success(array(
'cart_count' => WC()->cart->get_cart_contents_count(),
'cart_total' => WC()->cart->get_cart_total(),
));
}
}
wp_send_json_error('Не удалось добавить товар');
}В JavaScript добавьте вызов этого AJAX при нажатии на кнопку добавления в корзину (пример для jQuery):
jQuery(document).on('click', '.custom-add-to-cart', function(e) {
e.preventDefault();
var productID = jQuery(this).data('product-id');
jQuery.ajax({
url: wc_add_to_cart_params.ajax_url,
type: 'POST',
data: {
action: 'my_custom_add_to_cart',
product_id: productID
},
success: function(response) {
if (response.success) {
jQuery('.cart-count').text(response.data.cart_count);
jQuery('.cart-total').html(response.data.cart_total);
} else {
alert('Ошибка добавления в корзину');
}
}
});
});Проверка результата после внедрения
- Добавьте товар на страницу и кликните на кнопку с классом
custom-add-to-cart. - Проверьте, что количество товаров в корзине и сумма обновились без перезагрузки страницы.
- В консоли браузера не должно быть ошибок JavaScript.
- В сетевых запросах нет вызовов
wc-ajax=get_refreshed_fragments.
Частые ошибки и как их исправить
- AJAX запрос не срабатывает: проверьте правильность URL AJAX (
wc_add_to_cart_params.ajax_urlдолжен быть определён). - Корзина не обновляется визуально: убедитесь, что селекторы
.cart-countи.cart-totalсоответствуют элементам в вашей теме. - Скрипт стандартного AJAX корзины не отключился: проверьте приоритет хука, используйте 11 или выше для
wp_enqueue_scripts. - Ошибка "Не удалось добавить товар": проверьте, правильно ли передаётся ID товара и доступен ли он для добавления.
Практические советы по безопасности и производительности
- Проверяйте nonce в AJAX запросах для защиты от CSRF (в примере nonce для простоты опущен, добавьте его в реальном проекте).
- Отключение стандартного скрипта
wc-cart-fragmentsуменьшит количество сетевых запросов и повысит скорость загрузки. - Используйте дебаунс (throttle) на кнопках добавления в корзину, чтобы избежать множества запросов подряд.
- Для крупных магазинов рекомендуем использовать кэширование и CDN, но учитывайте, что AJAX должен работать корректно и не кэшироваться.
Таблица сравнения вариантов удаления и замены AJAX корзины
| Метод | Плюсы | Минусы | Применение |
|---|---|---|---|
| Отключение через фильтр и dequeue | Простота, уменьшение запросов | Потеря стандартной функциональности AJAX | Когда нужна полная кастомизация корзины |
| Модификация стандартного скрипта | Сохраняет базовую логику | Сложно поддерживать, возможны конфликты | Для мелких изменений |
| Использование готовых плагинов AJAX корзины | Быстрое решение, поддержка | Зависимость от стороннего кода, нагрузка | Когда нет ресурсов на разработку |