Диагностика проблемы: зачем удалять просмотренные товары из корзины?
В интернет-магазинах на WooCommerce корзина часто служит хранилищем товаров, которые посетитель добавил для покупки. Однако бывают ситуации, когда пользователь добавил товар, затем просмотрел его подробно, но решил не покупать, и товар остается в корзине, мешая оформлению заказа. Например, если товар временно отсутствует на складе, или клиент просто передумал.
Автоматическое удаление просмотренных товаров из корзины помогает поддерживать актуальность заказа и улучшает UX. Но WooCommerce по умолчанию не умеет различать просмотренные товары и не предоставляет встроенных средств для их удаления из корзины.
Как реализовать автоматическое удаление просмотренных товаров из корзины в WooCommerce
Шаг 1. Отслеживание просмотренных товаров
WooCommerce хранит историю просмотров товаров в cookie woocommerce_recently_viewed. Она содержит ID последних просмотренных товаров. Чтобы использовать эту информацию, нужно получить массив ID просмотренных товаров.
function get_viewed_products_ids() {
if ( empty( $_COOKIE['woocommerce_recently_viewed'] ) ) {
return [];
}
$viewed_products = explode( '|', sanitize_text_field( wp_unslash( $_COOKIE['woocommerce_recently_viewed'] ) ) );
$viewed_products = array_filter( array_map( 'absint', $viewed_products ) );
return $viewed_products;
}Шаг 2. Функция удаления просмотренных товаров из корзины
Создаем функцию, которая сравнит товары в корзине с просмотренными и удалит совпадения.
function wc_remove_viewed_products_from_cart() {
if ( ! is_user_logged_in() ) {
return; // Ограничимся залогиненными пользователями для стабильности
}
$viewed_ids = get_viewed_products_ids();
if ( empty( $viewed_ids ) ) {
return;
}
$cart = WC()->cart;
if ( ! $cart ) {
return;
}
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product_id = $cart_item['product_id'];
if ( in_array( $product_id, $viewed_ids, true ) ) {
$cart->remove_cart_item( $cart_item_key );
}
}
}Шаг 3. Запуск функции в нужный момент
Оптимальное время — перед загрузкой корзины или при инициализации WooCommerce. Подключим функцию к хуку woocommerce_before_cart:
add_action( 'woocommerce_before_cart', 'wc_remove_viewed_products_from_cart' );Проверка результата после внедрения
- Добавьте несколько товаров в корзину.
- Перейдите на страницы этих же товаров, чтобы они попали в cookie просмотра.
- Откройте страницу корзины — просмотренные товары должны быть автоматически удалены.
- Если товары не удаляются, проверьте наличие cookie
woocommerce_recently_viewedв браузере и работу хуков в теме.
Частые ошибки и способы их исправления
- Отсутствие cookie
woocommerce_recently_viewed: может быть отключена функция отслеживания просмотров или используется кэш, который блокирует установку cookie. Проверьте кэширование и настройки WooCommerce. - Функция срабатывает для гостей: в коде выше ограничение по
is_user_logged_in()— если хотите поддерживать гостей, нужно реализовать дополнительную логику для работы с сессиями. - Удаление не тех товаров: убедитесь, что в корзине и в cookie используются совпадающие product_id, а не variation_id. Для вариаций может потребоваться расширение логики.
- Нарушение UX: удаление товаров без предупреждения может сбивать пользователя. Рассмотрите вариант уведомления о действиях или кнопки отмены.
Практические советы по производительности и безопасности
- Не вызывайте удаление товаров на каждой странице — ограничьте действие только страницей корзины через
woocommerce_before_cart. - Используйте
sanitize_text_fieldиabsintдля очистки данных из cookie во избежание XSS и ошибок. - Если на сайте включено кэширование страниц, отключите кэширование для страницы корзины, чтобы изменения применялись корректно.
- При необходимости расширьте логику, учитывая вариации товаров (
variation_id) и пользовательские мета-данные.
Сравнение способов реализации удаления просмотренных товаров из корзины
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Код на хуке woocommerce_before_cart |
Самописная функция, удаляющая товары из корзины по списку просмотренных | Полный контроль, без плагинов, легкая доработка | Требует навыков PHP, не работает с кэшем и гостями без доработок |
| Плагин с аналогичной функцией | Использование готовых решений для очистки корзины | Простота установки, поддержка | Может быть избыточным, нагрузка, ограниченная кастомизация |
| Использование JS + AJAX | Удаление товаров по просмотрам на стороне клиента | Гибкость, мгновенная реакция | Зависимость от браузера, сложнее отладка |