WooCommerce: автоматическое удаление товаров из корзины при неактивности пользователя

Проблема: накопление товаров в корзине из-за неактивных пользователей

В 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
⭐⭐⭐⭐⭐