Проблема: товары застревают в корзине и мешают конверсии
В интернет-магазинах на WooCommerce пользователи часто добавляют товары в корзину, но не завершают покупку. Это приводит к "зависшим" товарам, которые занимают корзину и могут мешать аналитике и пользовательскому опыту. Стандартного функционала автоматического удаления товаров из корзины по времени WooCommerce не предоставляет.
Диагностика проблемы
Чтобы понять, насколько актуальна проблема, проверьте, как долго товары остаются в корзине покупателей. Это можно сделать, изучив сессии пользователей и содержимое корзины в базе данных (таблица wp_woocommerce_sessions). Если товары лежат в корзине по несколько дней без оплаты, есть смысл автоматизировать их очистку.
Проверка содержимого корзин в базе данных
SELECT session_key, session_value, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry ASC LIMIT 10;Здесь session_value содержит сериализованные данные корзины, а session_expiry — время истечения сессии.
Решение: добавление автоматической очистки корзины по времени
Реализуем функцию, которая будет запускаться по CRON и очищать корзины, в которых товары находятся дольше заданного времени (например, 24 часа).
Шаг 1. Создание функции очистки корзины
function wpfix_clear_old_woocommerce_carts() {
global $wpdb;
$expiration_time = 24 * HOUR_IN_SECONDS; // 24 часа
$time_now = time();
// Получаем все сессии WooCommerce
$sessions = $wpdb->get_results("SELECT session_key, session_value, session_expiry FROM {$wpdb->prefix}woocommerce_sessions");
foreach ($sessions as $session) {
// Проверяем, истекло ли время хранения сессии
if ($session->session_expiry < $time_now - $expiration_time) {
$data = maybe_unserialize($session->session_value);
if (!empty($data['cart']) && is_array($data['cart'])) {
// Очищаем корзину
$data['cart'] = [];
$new_value = maybe_serialize($data);
// Обновляем запись в базе
$wpdb->update(
"{$wpdb->prefix}woocommerce_sessions",
['session_value' => $new_value],
['session_key' => $session->session_key]
);
}
}
}
}Шаг 2. Регистрация CRON задачи
Создадим расписание для запуска очистки раз в час.
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['hourly_custom'])) {
$schedules['hourly_custom'] = [
'interval' => 3600,
'display' => __('Каждый час')
];
}
return $schedules;
});
if (!wp_next_scheduled('wpfix_hourly_clear_cart')) {
wp_schedule_event(time(), 'hourly_custom', 'wpfix_hourly_clear_cart');
}
add_action('wpfix_hourly_clear_cart', 'wpfix_clear_old_woocommerce_carts');Шаг 3. Очистка после успешной оплаты
WooCommerce по умолчанию очищает корзину после оплаты, но убедимся, что это работает корректно. Можно добавить хук для сброса корзины после заказа:
add_action('woocommerce_thankyou', function($order_id) {
WC()->cart->empty_cart();
});Проверка результата после внедрения
- Добавьте товар в корзину и оставьте ее без оформления заказа более 24 часов.
- Запустите вручную функцию
wpfix_clear_old_woocommerce_carts()через консоль или временно вызовите ее в теме. - Проверьте таблицу
wp_woocommerce_sessions, убедитесь, что корзина для соответствующей сессии обнулена. - Проверьте на фронтенде, что корзина очищена и пользователь видит пустую корзину.
Частые ошибки и как их исправить
- CRON задача не запускается: убедитесь, что WordPress CRON активен, и что хук
wpfix_hourly_clear_cartзарегистрирован. Для теста можете вызвать функцию вручную. - Корзина не очищается: проверьте, что в таблице
wp_woocommerce_sessionsесть записи, и что времяsession_expiryкорректно обновляется. - Ошибка сериализации данных: используйте функции
maybe_serializeиmaybe_unserializeдля работы сsession_value. - Пользователь жалуется на удаление корзины слишком рано: скорректируйте значение
$expiration_timeв функции.
Практические советы по безопасности и производительности
- При работе с базой используйте подготовленные запросы (в нашем случае
$wpdb->updateбезопасен, так как передаем данные напрямую). - Не запускайте функцию очистки слишком часто — это может повлиять на производительность.
- Для сайтов с большой базой сессий стоит реализовать пакетную очистку с лимитом, чтобы не перегружать базу.
- Для дополнительной безопасности ограничьте IP-доступ к административным страницам и используйте защиту от ботов, чтобы избежать спама с корзинами.
Сравнение вариантов решения
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин сторонний | Использование готового плагина очистки корзины | Быстрая настройка, поддержка | Может нагружать систему, зависит от качества плагина |
| Кастомный код (наши примеры) | Прямое управление сессиями и корзиной через код | Легко контролировать, оптимизировать, гибко подстраивать | Требует навыков программирования, поддержка на разработчике |
| Отключение сессий | Полное удаление функционала сессий WooCommerce | Упрощение, меньше нагрузки | Потеря функционала корзины и пользовательского опыта |