Проблема: накопление товаров в корзине из-за неактивных пользователей
В WooCommerce корзина пользователя сохраняется на длительное время, что может приводить к блокировке товаров, особенно если у вас ограниченный склад или распродажные позиции. Пользователи добавляют товары, но не завершают покупку, и корзина «замораживает» эти товары, снижая продажи.
Диагностика: как понять, что корзина не очищается
- Проверьте, сколько товаров в корзинах гостей и зарегистрированных пользователей остается без изменений в течение нескольких дней.
- Используйте SQL-запрос к таблице
wp_woocommerce_sessionsдля оценки времени жизни сессий и корзин. - Проверьте настройки хука
wc_session_expiring, отвечающего за время хранения сессии.
Пошаговое решение: автоматическое удаление товаров из корзины через WP-Cron
1. Создаем функцию очистки корзины для неактивных пользователей
function wpin_clear_inactive_cart() {
global $wpdb;
$expiration = 2 * DAY_IN_SECONDS; // 2 дня неактивности
// Получаем все сессии с датой последнего обновления
$sessions = $wpdb->get_results(
"SELECT session_key, session_value, session_expiry FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP()"
);
foreach ($sessions as $session) {
$data = maybe_unserialize($session->session_value);
if (!empty($data['cart'])) {
// Удаляем корзину, если сессия истекла
$wpdb->delete(
"{$wpdb->prefix}woocommerce_sessions",
['session_key' => $session->session_key]
);
}
}
}2. Регистрируем WP-Cron событие для периодической очистки
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wpin_clear_cart_event')) {
wp_schedule_event(time(), 'daily', 'wpin_clear_cart_event');
}
});
add_action('wpin_clear_cart_event', 'wpin_clear_inactive_cart');3. Опционально: удаляем запланированное событие при деактивации темы или плагина
function wpin_clear_cart_deactivation() {
$timestamp = wp_next_scheduled('wpin_clear_cart_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpin_clear_cart_event');
}
}
register_deactivation_hook(__FILE__, 'wpin_clear_cart_deactivation');Проверка результата после внедрения
- Добавьте товар в корзину, затем удалите или очистите кук сессии, чтобы имитировать неактивность.
- Запустите вручную крон через WP-CLI:
wp cron event run wpin_clear_cart_event. - Проверьте таблицу
wp_woocommerce_sessions- корзина должна удалиться у сессий с истекшим сроком. - На фронтенде у пользователя корзина должна очиститься после обновления страницы.
Частые ошибки и как исправить
- Не очищаются корзины пользователей: Проверьте, что время в
session_expiryкорректно отражает время истечения сессии. В WooCommerce сессии по умолчанию живут 48 часов, но могут быть переопределены. - WP-Cron не срабатывает: Убедитесь, что на сервере работает wp-cron, или настройте системный cron для вызова
wp-cron.php. - Удаление корзины удаляет все сессии подряд: Добавьте дополнительную проверку на наличие товаров в корзине перед удалением, чтобы не удалять все подряд.
- Проблемы с сериализацией данных: Используйте функции
maybe_serializeиmaybe_unserializeпри работе с сессионными данными.
Практические советы по оптимизации и безопасности
- Регулярно проверяйте таблицу
wp_woocommerce_sessionsна накопление устаревших сессий, чтобы избежать раздувания базы. - При большом количестве пользователей лучше запускать удаление корзин партиями, чтобы не перегружать БД.
- Используйте WP-CLI для диагностики и управления cron-событиями.
- Чтобы избежать потери данных, не удаляйте сессии зарегистрированных пользователей без согласия — можно только гостей.
Таблица сравнения вариантов реализации
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| WP-Cron с удалением сессий | Автоматизация, не требует плагинов | Зависит от работы wp-cron, нагрузка при большом трафике | wp_schedule_event + wpdb->delete |
| Плагин для очистки корзины | Простота настройки, поддержка | Дополнительная нагрузка, ограниченная кастомизация | WooCommerce Cart Expiration Plugins |
| Клиентский JS с таймаутом | Мгновенное удаление после бездействия | Не надежно, если пользователь просто ушёл | JS скрипты с AJAX |