WooCommerce: автоматическое удаление неактивных товаров из корзины через AJAX

Проблема: неактуальные товары остаются в корзине пользователя

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

Диагностика проблемы

  • Проверьте наличие товаров в корзине, которые отсутствуют или отключены на сайте.
  • Попробуйте оформить заказ с таким товаром — появится предупреждение об отсутствии товара.
  • Посмотрите в админке WooCommerce - Товары, есть ли товары со статусом "черновик" или "скрытый", которые могут попасть в корзину через пользовательские сессии.

Пошаговое решение: удаление неактивных товаров из корзины через AJAX

Мы реализуем проверку статуса товаров в корзине и удаление неактивных позиций без перезагрузки страницы с помощью AJAX.

1. Добавляем AJAX обработчик в functions.php вашей темы или в плагин

add_action('wp_ajax_check_and_remove_inactive_products', 'check_and_remove_inactive_products');
add_action('wp_ajax_nopriv_check_and_remove_inactive_products', 'check_and_remove_inactive_products');

function check_and_remove_inactive_products() {
    if (!WC()->cart) {
        wp_send_json_error('Корзина не инициализирована');
    }

    $removed = [];
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if (!$product || !$product->is_visible() || !$product->is_in_stock()) {
            WC()->cart->remove_cart_item($cart_item_key);
            $removed[] = $product ? $product->get_id() : 'неизвестный товар';
        }
    }

    WC()->cart->calculate_totals();

    wp_send_json_success(['removed_products' => $removed]);
}

2. Подключаем AJAX скрипт на фронтенде

Добавьте в файл JavaScript вашего шаблона или подключите отдельный скрипт, который будет отправлять AJAX-запрос при загрузке страницы корзины.

jQuery(document).ready(function($) {
    $.ajax({
        url: wc_cart_params.ajax_url,
        type: 'POST',
        data: {
            action: 'check_and_remove_inactive_products'
        },
        success: function(response) {
            if(response.success) {
                if(response.data.removed_products.length > 0) {
                    console.log('Удалены неактивные товары из корзины:', response.data.removed_products);
                    // Перезагрузить корзину для обновления интерфейса
                    $(document.body).trigger('updated_cart_totals');
                }
            }
        }
    });
});

3. Регистрируем и локализуем скрипт в functions.php

function enqueue_cart_check_script() {
    if (is_cart()) {
        wp_enqueue_script('inactive-products-check', get_template_directory_uri() . '/js/inactive-products-check.js', ['jquery'], '1.0', true);
        wp_localize_script('inactive-products-check', 'wc_cart_params', [
            'ajax_url' => admin_url('admin-ajax.php')
        ]);
    }
}
add_action('wp_enqueue_scripts', 'enqueue_cart_check_script');

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

  • Зайдите на страницу корзины с товарами, некоторые из которых отключены или отсутствуют в наличии.
  • Откройте консоль браузера (F12) и проверьте сообщения об удалённых товарах.
  • Убедитесь, что неактивные товары исчезли из корзины без перезагрузки страницы.
  • Попробуйте оформить заказ — ошибки из-за отсутствующих товаров должны исчезнуть.

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

  • Ошибка: корзина не инициализирована
    Проверьте, что WooCommerce инициализирован до вызова WC()->cart. Скрипт должен запускаться только на странице корзины.
  • AJAX запрос не срабатывает
    Убедитесь, что подключён jQuery и правильно локализован скрипт с ajax_url.
  • Товары не удаляются
    Проверьте условия проверки товара: $product->is_visible() и $product->is_in_stock(). Возможно, нужны другие условия в зависимости от логики магазина.

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

  • Обрабатывайте AJAX запросы только для авторизованных пользователей или на страницах корзины, чтобы не создавать лишнюю нагрузку.
  • Не забывайте вызывать WC()->cart->calculate_totals() после удаления товаров, иначе сумма будет некорректной.
  • Добавьте nonce-проверку для безопасности AJAX вызова, если запрос может изменять состояние корзины.
  • Кэширование страницы корзины лучше отключить, чтобы клиент всегда видел актуальное состояние корзины.

Сравнение подходов удаления неактивных товаров из корзины

МетодПлюсыМинусы
Ручная проверка и удаление в админкеПростота, не требует кодаТребует времени и не автоматизировано
Удаление при оформлении заказа (hook woocommerce_check_cart_items)Защищает оформление заказаПользователь увидит ошибку, а не автоматическое исправление
Автоматическое удаление через AJAX (этот метод)Удобно, улучшает UX, предотвращает ошибки заказаТребует реализации и поддержки кода
Как создать и использовать комплексные метаполя в WordPress
11.03.2026
WooCommerce: как удалить товар из корзины через AJAX без перезагрузки страницы
01.07.2026
Как добавить дополнительные поля в регистрацию WordPress с помощью хуков
14.01.2026
Оптимальная настройка Cron задач в WordPress для повышения производительности
17.01.2026
Как создать динамические формы в WordPress с помощью AJAX
23.12.2025

На оформлении, скоро здесь появится полноценный ресурс