Как удалить и заменить WooCommerce AJAX корзину в теме WordPress

Диагностика проблемы с 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 корзиныБыстрое решение, поддержкаЗависимость от стороннего кода, нагрузкаКогда нет ресурсов на разработку
Оптимизация темы WordPress для скорости: лучшие практики и примеры
07.11.2025
Как удалить или изменить WooCommerce AJAX корзину без плагинов
28.04.2026
Как создать тему WordPress с поддержкой RTL (Right-to-Left)
21.03.2026
Как удалить виджет или область сайдбара в WordPress без плагинов
16.01.2026
Как убрать типичные PHP warnings и ошибки WooCommerce в теме WordPress
16.05.2026