Проблема: товар остаётся в корзине при обновлении количества в WooCommerce
В стандартном WooCommerce при изменении количества товара в корзине, если указать количество 0, товар не удаляется автоматически. Многие пользователи ожидают, что указание нуля удалит товар, но по умолчанию этого не происходит. Это может привести к путанице и неудобству для покупателей.
Диагностика проблемы
Для проверки, как работает корзина в вашем магазине, сделайте следующее:
- Добавьте товар в корзину.
- Перейдите на страницу корзины.
- Попробуйте изменить количество товара на 0 и нажать "Обновить корзину".
- Обратите внимание, останется ли товар или будет удалён.
Если товар не удаляется, значит WooCommerce не обрабатывает количество "0" как команду на удаление.
Пошаговое решение: автоматическое удаление товара при количестве 0
Чтобы исправить это, добавим пользовательский код, который будет удалять товар из корзины, если его количество обновлено до 0.
1. Добавляем фильтр на обновление корзины
Откройте файл functions.php вашей дочерней темы (или используйте плагин для пользовательских функций) и добавьте следующий код:
add_action('woocommerce_before_cart', 'wc_remove_products_with_zero_quantity');
function wc_remove_products_with_zero_quantity() {
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
if ( isset( $_POST['cart'][$cart_item_key]['qty'] ) ) {
$qty = intval( $_POST['cart'][$cart_item_key]['qty'] );
if ( $qty === 0 ) {
WC()->cart->remove_cart_item( $cart_item_key );
}
}
}
}Этот хук срабатывает перед выводом корзины. Мы перебираем все товары и смотрим, если в POST-запросе пришло количество 0, то удаляем товар.
2. Обработка AJAX обновления корзины
Если на вашем сайте используется AJAX для обновления корзины, понадобится дополнительный хук для обработки удаления товара при количестве 0:
add_action('wp_ajax_update_cart', 'wc_handle_zero_qty_ajax');
add_action('wp_ajax_nopriv_update_cart', 'wc_handle_zero_qty_ajax');
function wc_handle_zero_qty_ajax() {
if ( ! empty( $_POST['cart'] ) && is_array( $_POST['cart'] ) ) {
foreach ( $_POST['cart'] as $cart_item_key => $values ) {
$qty = intval( $values['qty'] );
if ( $qty === 0 ) {
WC()->cart->remove_cart_item( $cart_item_key );
}
}
WC()->cart->calculate_totals();
}
wp_send_json_success();
}Этот код нужно адаптировать под AJAX-метод, используемый вашим шаблоном или плагином. Если AJAX обновление сделано через стандартные WooCommerce скрипты, дополнительная обработка может не понадобиться.
Проверка результата после внедрения
- Добавьте товар в корзину.
- Перейдите на страницу корзины.
- Измените количество товара на 0 и нажмите «Обновить корзину».
- Товар должен исчезнуть из списка товаров в корзине.
- Обновите страницу, чтобы проверить, что товар действительно удалён.
Частые ошибки и их исправления
- Код не работает на AJAX-обновлении: убедитесь, что ваш шаблон использует стандартный механизм обновления корзины WooCommerce. Если AJAX кастомный, добавьте обработку в соответствующие AJAX-хуки.
- PHP-ошибки после вставки кода: проверьте правильно ли вы скопировали код, особенно символы стрелок (
->) и кавычки. - Товар не удаляется, если количество не равно 0: код специально реагирует только на 0, для других значений оставляет товар.
- Удаление не происходит на странице оформления заказа: данный код работает только на странице корзины, для оформления заказа потребуется отдельная логика.
Практические советы по безопасности и производительности
- Не изменяйте ядро WooCommerce: используйте хуки и фильтры, как показано.
- Тестируйте изменения на тестовом сайте, чтобы исключить конфликты с другими плагинами.
- Используйте кеширование с осторожностью, чтобы не кэшировались страницы корзины с неправильным содержимым.
Альтернативные варианты: плагин или код?
| Вариант | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Быстрая настройка, нет дополнительных плагинов, гибкость | Требуется знание PHP, возможны ошибки без тестирования |
| Плагин для кастомизации корзины | Простота использования, поддержка разработчика | Может замедлить сайт, не всегда бесплатно, возможно переизбыточно |