WooCommerce: автоматическая очистка корзины и отслеживание брошенных заказов

Диагностика проблемы с брошенными корзинами в WooCommerce

В WooCommerce часто возникает ситуация, когда пользователи добавляют товары в корзину, но не завершают покупку. Это приводит к "зависшим" корзинам, которые могут создавать нагрузку на базу данных и исказить аналитику. Важно вовремя очищать такие корзины и при этом иметь возможность отслеживать брошенные заказы для дальнейшей работы с клиентом.

Как определить, что корзина нуждается в очистке?

  • Корзина не обновлялась длительное время (обычно более 24 часов).
  • Нет активности пользователя, например, отсутствие заказов с этим же пользовательским ID или сессией.
  • Рост записей в таблице wp_woocommerce_sessions.

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

SELECT COUNT(*) FROM wp_woocommerce_sessions;

Если число сессий растет постоянно без снижения — значит, очистка не происходит.

Пошаговое решение: автоматическая очистка корзин и уведомления о брошенных заказах

1. Очистка старых сессий WooCommerce

WooCommerce хранит данные корзин в таблице wp_woocommerce_sessions. По умолчанию сессии очищаются через 48 часов, но этот интервал можно настроить и дополнительно удалить старые сессии через WP-Cron.

Добавьте следующий код в functions.php вашей темы или в отдельный плагин:

function wc_cleanup_old_sessions() {
    global $wpdb;
    $expiration = 48 * HOUR_IN_SECONDS; // 48 часов
    $time = time() - $expiration;

    $sessions_table = $wpdb->prefix . 'woocommerce_sessions';
    // Удаляем сессии, которые не обновлялись более 48 часов
    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $sessions_table WHERE session_expiry < %d",
            $time
        )
    );
}

// Регистрируем WP-Cron для очистки раз в 12 часов
if ( ! wp_next_scheduled( 'wc_cleanup_sessions_event' ) ) {
    wp_schedule_event( time(), 'twicedaily', 'wc_cleanup_sessions_event' );
}
add_action( 'wc_cleanup_sessions_event', 'wc_cleanup_old_sessions' );

2. Отслеживание брошенных заказов с помощью хука

Для сбора данных о брошенных корзинах можно использовать хук woocommerce_cart_emptied или отслеживать статус заказов, которые не были завершены.

Пример логирования брошенных корзин для последующего анализа:

add_action( 'woocommerce_cart_emptied', 'log_abandoned_cart' );
function log_abandoned_cart() {
    if ( ! is_user_logged_in() ) {
        return; // Логируем только для авторизованных пользователей
    }

    $user_id = get_current_user_id();
    $cart = WC()->cart->get_cart();
    $cart_items = [];

    foreach ( $cart as $item ) {
        $cart_items[] = [
            'product_id' => $item['product_id'],
            'quantity' => $item['quantity'],
        ];
    }

    if ( empty( $cart_items ) ) {
        return;
    }

    // Записываем в пользовательский мета ключ
    update_user_meta( $user_id, '_last_abandoned_cart', $cart_items );
}

3. Отправка напоминаний пользователям о брошенных корзинах

Для отправки email-напоминаний используйте WP-Cron и функцию wp_mail(). Пример запуска задачи раз в день:

function send_abandoned_cart_reminders() {
    $users = get_users();

    foreach ( $users as $user ) {
        $cart_items = get_user_meta( $user->ID, '_last_abandoned_cart', true );
        if ( empty( $cart_items ) ) {
            continue;
        }

        $message = "Здравствуйте, вы оставили товары в корзине:\n";
        foreach ( $cart_items as $item ) {
            $product = wc_get_product( $item['product_id'] );
            if ( $product ) {
                $message .= $product->get_name() . ' - Количество: ' . $item['quantity'] . "\n";
            }
        }
        $message .= "\nПерейдите к оформлению заказа: " . wc_get_cart_url();

        wp_mail( $user->user_email, 'Напоминание о брошенной корзине', $message );

        // Очистка мета после отправки
        delete_user_meta( $user->ID, '_last_abandoned_cart' );
    }
}

if ( ! wp_next_scheduled( 'send_abandoned_cart_reminders_event' ) ) {
    wp_schedule_event( time(), 'daily', 'send_abandoned_cart_reminders_event' );
}
add_action( 'send_abandoned_cart_reminders_event', 'send_abandoned_cart_reminders' );

Проверка результата после внедрения

  • Проверьте таблицу wp_woocommerce_sessions до и после запуска очистки — количество записей должно уменьшиться.
  • Симулируйте добавление товара в корзину и выход без оформления — через сутки проверьте, отправилось ли письмо-напоминание.
  • Проверьте логи пользователей с мета ключом _last_abandoned_cart через phpMyAdmin или кодом get_user_meta().

Частые ошибки и как их исправить

  • Сессии не удаляются: Проверьте, что WP-Cron работает корректно (например, с помощью плагина WP Crontrol). Если сайт без посещений, WP-Cron может не запускаться — настройте серверный cron.
  • Письма не отправляются: Убедитесь, что wp_mail() правильно настроена, нет блокировок SMTP, и письма не попадают в спам. Рекомендуется использовать SMTP-плагины.
  • Накладная нагрузка при большом числе пользователей: Делайте рассылку партиями, например, по 50 пользователей за запуск WP-Cron.

Практические советы по безопасности и производительности

  • Не храните лишние данные в пользовательских метах. После отправки напоминания очищайте метаданные.
  • Для очистки сессий используйте подготовленные запросы и минимизируйте время выполнения.
  • Для крупных сайтов лучше настроить системный cron вместо WP-Cron, чтобы избежать сбоев при низкой посещаемости.
  • Рассмотрите использование специализированных плагинов для брошенных корзин, если нужен расширенный функционал (например, Abandoned Cart Lite for WooCommerce), но не забывайте про нагрузку и безопасность.

Сравнение вариантов очистки корзин и работы с брошенными заказами

МетодПлюсыМинусыКод / Плагин
Ручная очистка через WP-CronЛегко контролировать, кастомизация под нуждыТребует настройки cron, возможны сбоиКод из статьи
Отслеживание через пользовательские метаПозволяет собирать данные для email-рассылокНужно аккуратно очищать метаданныеКод из статьи
Плагины для брошенных корзинГотовый функционал, шаблоны писем, аналитикаМогут нагружать сайт, требуют обновленийAbandoned Cart Lite, WooCommerce Cart Abandonment Recovery
Как изменить возможности пользователя в WordPress без плагинов
05.01.2026
Как использовать хуки в WordPress для расширения функциональности
19.11.2025
Как использовать REST API в WordPress для создания плагинов
11.11.2025
Как удалить неиспользуемые таксономии в WordPress
22.02.2026
Как использовать Meta Box в WordPress для управления дополнительными данными
31.12.2025