Как удалить корзину WooCommerce и обновить страницу без конфликтов AJAX

Диагностика проблемы: почему корзина WooCommerce не обновляется корректно

При удалении товара из корзины WooCommerce стандартно срабатывает AJAX-запрос, который обновляет содержимое корзины без перезагрузки страницы. Однако, в ряде случаев, после кастомных изменений, плагинов или тем, AJAX-обновление работает некорректно: корзина не обновляется, страница не изменяется, количество товаров не меняется. Это приводит к путанице у пользователей и снижению конверсии.

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

  • После удаления товара из корзины страница не обновляется и товар остается видимым.
  • Количество товаров в иконке корзины не меняется.
  • Консоль браузера показывает ошибки JavaScript.
  • Конфликты с плагинами или темами при использовании кастомных обработчиков AJAX.

Пошаговое решение проблемы обновления корзины WooCommerce

1. Проверка стандартных скриптов WooCommerce

WooCommerce использует скрипт woocommerce-cart и wc-cart-fragments для AJAX-обновления корзины. Проверьте, что они подключены на странице корзины:

function check_woocommerce_scripts() {
    if (is_cart()) {
        wp_enqueue_script('wc-cart-fragments');
        wp_enqueue_script('woocommerce');
        wp_enqueue_script('wc-cart');
    }
}
add_action('wp_enqueue_scripts', 'check_woocommerce_scripts');

Если эти скрипты отключены или отсутствуют, AJAX-обновление работать не будет.

2. Правильная реализация удаления товара с помощью AJAX

Вместо стандартной ссылки удаления товара ?remove_item=... можно использовать AJAX вручную. Вот пример кастомного jQuery кода для кнопки удаления:

jQuery(document).on('click', '.custom-remove-item', function(e) {
    e.preventDefault();
    var product_key = jQuery(this).data('product_key');
    jQuery.ajax({
        url: wc_cart_params.wc_ajax_url.toString().replace('%%endpoint%%', 'remove_item_from_cart'),
        type: 'POST',
        data: {
            product_key: product_key
        },
        success: function(response) {
            if (response && response.fragments) {
                jQuery.each(response.fragments, function(key, value) {
                    jQuery(key).replaceWith(value);
                });
                jQuery(document.body).trigger('wc_fragment_refresh');
            }
        }
    });
});

И серверная часть для обработки AJAX-запроса:

add_action('wp_ajax_remove_item_from_cart', 'ajax_remove_item_from_cart');
add_action('wp_ajax_nopriv_remove_item_from_cart', 'ajax_remove_item_from_cart');

function ajax_remove_item_from_cart() {
    if (empty($_POST['product_key'])) {
        wp_send_json_error('Product key missing');
    }
    $product_key = sanitize_text_field($_POST['product_key']);
    $cart = WC()->cart;
    $cart->remove_cart_item($product_key);
    WC()->cart->calculate_totals();

    ob_start();
    woocommerce_cart_totals();
    $cart_totals = ob_get_clean();

    ob_start();
    woocommerce_mini_cart();
    $mini_cart = ob_get_clean();

    wp_send_json_success(array(
        'fragments' => array(
            '.woocommerce-cart-form' => $cart_totals,
            '.widget_shopping_cart_content' => $mini_cart
        )
    ));
}

3. Принудительное обновление страницы после удаления

Если AJAX обновление невозможно или вызывает конфликты, альтернативный вариант — принудительная перезагрузка страницы после удаления:

jQuery(document).on('click', '.custom-remove-item', function(e) {
    e.preventDefault();
    var url = jQuery(this).attr('href');
    window.location.href = url;
});

Но это снижает UX и должно использоваться только при невозможности корректной работы AJAX.

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

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

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

  • Отсутствие скриптов WooCommerce: Решение — подключить wc-cart-fragments и другие необходимые скрипты.
  • Неправильный AJAX URL: Используйте wc_cart_params.wc_ajax_url и заменяйте %%endpoint%% на нужный action.
  • Необновление корзины после удаления: Убедитесь, что после удаления вызывается событие wc_fragment_refresh, либо вручную обновляйте фрагменты DOM.
  • Конфликты с другими плагинами: Проверьте конфликты, временно отключая плагины, и исправьте конфликтный код.

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

  • Используйте nonce-поля для AJAX-запросов, чтобы защитить от CSRF-атак:
wp_localize_script('custom-script', 'my_ajax_obj', array(
    'ajax_url' => admin_url('admin-ajax.php'),
    'nonce' => wp_create_nonce('remove_item_nonce')
));
  • В серверной функции проверяйте nonce:
if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'remove_item_nonce')) {
    wp_send_json_error('Invalid nonce');
}
  • Минимизируйте количество DOM-обновлений, обновляя только необходимые части страницы.
  • Используйте кэширование для мини-корзины, если она используется на всех страницах.

Сравнение вариантов решения проблемы удаления товара из корзины WooCommerce

МетодПлюсыМинусы
Стандартный AJAX WooCommerceРаботает из коробки, хорошая производительность, плавный UXМожет конфликтовать с кастомными скриптами и темами
Кастомный AJAX с wp_ajaxГибкость, возможность расширения логикиТребует дополнительного кода и тестирования
Перезагрузка страницыПростота реализации, совместимостьПлохой UX, замедляет работу сайта
Как автоматически проверять здоровье сайта WordPress с помощью WPUnit
16.04.2026
Правильное удаление неактивных пользователей WordPress с примером кода
30.04.2026
Как использовать REST API для автоматического создания и обновления товаров WooCommerce
20.04.2026
Как создать собственный объект метаданных в WordPress для расширенного хранения данных
19.03.2026
Успешная авторизация WordPress с использованием REST API
18.12.2025