Диагностика задачи: зачем и когда нужно удалять товары из корзины автоматически
В WooCommerce бывают ситуации, когда необходимо программно удалить определённые товары из корзины без участия пользователя. Например, если товар находится в корзине дольше 24 часов, если сумма товаров превышает лимит, или при изменении пользовательских данных. В стандартном функционале WooCommerce нет встроенного решения, поэтому приходится создавать кастомные скрипты.
Пошаговое решение: автоматическое удаление товаров из корзины по времени нахождения
1. Отслеживаем время добавления товара в корзину
WooCommerce не хранит время добавления товара в корзину по умолчанию, поэтому добавим мета-данные к каждому элементу корзины при добавлении:
add_filter('woocommerce_add_cart_item_data', 'add_time_to_cart_item', 10, 3);
function add_time_to_cart_item($cart_item_data, $product_id, $variation_id) {
$cart_item_data['added_time'] = time();
return $cart_item_data;
}2. Запускаем проверку и удаление устаревших товаров при загрузке страницы корзины
Используем хук woocommerce_before_cart чтобы проверять товары и удалять те, которые в корзине дольше 24 часов (86400 секунд):
add_action('woocommerce_before_cart', 'remove_old_cart_items');
function remove_old_cart_items() {
$cart = WC()->cart;
if ( ! $cart ) return;
$items_to_remove = [];
$current_time = time();
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
if ( isset($cart_item['added_time']) && ($current_time - $cart_item['added_time'] > 86400) ) {
$items_to_remove[] = $cart_item_key;
}
}
foreach ( $items_to_remove as $key ) {
$cart->remove_cart_item( $key );
}
}3. Обновляем сессию и корзину
WooCommerce сам обновляет сессию и корзину после удаления товаров, дополнительных действий не требуется.
Проверка результата после внедрения
- Добавьте товар в корзину и проверьте, что к нему в данных корзины добавился ключ
added_time. Через инструменты разработчика или отладчик можно проверить массив корзины. - Измените значение времени в
added_time(например, вручную в базе или через фильтр) на более старое, чем 24 часа. - Откройте страницу корзины — товар должен автоматически удалиться.
- Убедитесь, что корзина обновилась без ошибок и без необходимости ручного обновления.
Частые ошибки и как исправить
- Товары не удаляются: проверьте, что мета
added_timeдействительно добавился при добавлении в корзину. Включите дебаг и логирование с помощьюerror_log(). - Удаление происходит слишком рано или слишком поздно: проверьте правильность вычисления времени и используемую константу 86400 (24 часа в секундах).
- Корзина не обновляется: убедитесь, что функция вызывается на странице корзины, а не на других страницах, и что нет конфликтов с кеширующими плагинами.
- Конфликты с другими плагинами: протестируйте решение на чистом WooCommerce без сторонних плагинов, чтобы исключить конфликты.
Практические советы по безопасности и производительности
- Не храните лишние данные в сессии корзины, ограничьтесь только ключом
added_timeдля минимизации нагрузки. - Для сайтов с большим трафиком и корзинами лучше запускать удаление через WP-Cron или серверный cron, чтобы не замедлять загрузку страницы.
- Обязательно протестируйте решение в разных браузерах и при включённом кешировании.
- Если требуется удалять товары по другим условиям (цена, категория, пользовательские поля), используйте аналогичный подход с проверкой и удалением по условию.
Сравнение вариантов реализации автоматического удаления товаров из корзины
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
Добавление мета added_time и проверка на странице корзины | Простая реализация, не требует дополнительного cron | Работает только при посещении страницы корзины | Код из статьи |
| WP-Cron задача для удаления просроченных товаров | Работает независимо от посещения сайта, лучше для больших проектов | Сложнее в настройке, требует cron | Создание cron задачи с вызовом удаления по условию |
| Использование сторонних плагинов для управления корзиной | Готовые решения с графическим интерфейсом | Могут быть тяжелыми и избыточными | Плагины вроде WooCommerce Cart Reports |