Проблема: неактуальные товары остаются в корзине пользователя
В 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, предотвращает ошибки заказа | Требует реализации и поддержки кода |