WooCommerce: автоматическое удаление пустых корзин (сессий) без плагинов

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

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

Чтобы убедиться, что проблема актуальна, выполните SQL-запрос для подсчёта количества пустых сессий:

SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_value = '' OR session_value IS NULL;

Если число пустых или неактивных сессий велико (например, тысячи), нужно настроить автоматическое удаление таких записей.

Как устроено хранение сессий WooCommerce

WooCommerce хранит сессии в таблице wp_woocommerce_sessions с колонками:

  • session_key — уникальный ключ сессии;
  • session_value — сериализованные данные корзины и пользовательской сессии;
  • session_expiry — метка времени окончания действия сессии.

Пустая корзина обычно означает, что session_value содержит минимальные данные или пустой массив. При этом сессия может оставаться в базе до истечения session_expiry.

Пошаговое решение: автоматическое удаление пустых корзин через кастомный WP-Cron

1. Создаём функцию очистки сессий

function wptemp_cleanup_empty_woocommerce_sessions() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $time_now = time();

    // Удаляем сессии с пустым или минимальным содержимым и просроченные
    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $table WHERE 
             (session_value = '' OR session_value = 'a:0:{}' OR session_value IS NULL) 
             OR session_expiry < %d",
            $time_now
        )
    );

    if (defined('WP_DEBUG') && WP_DEBUG) {
        error_log("WooCommerce: удалено сессий корзин: " . $deleted);
    }
}

2. Регистрируем WP-Cron задачу

function wptemp_schedule_empty_sessions_cleanup() {
    if (!wp_next_scheduled('wptemp_empty_sessions_cleanup_hook')) {
        wp_schedule_event(time(), 'daily', 'wptemp_empty_sessions_cleanup_hook');
    }
}
add_action('wp', 'wptemp_schedule_empty_sessions_cleanup');

3. Привязываем функцию к крону

add_action('wptemp_empty_sessions_cleanup_hook', 'wptemp_cleanup_empty_woocommerce_sessions');

4. Очистка при деактивации темы/плагина

function wptemp_deactivate_cleanup() {
    wp_clear_scheduled_hook('wptemp_empty_sessions_cleanup_hook');
}
register_deactivation_hook(__FILE__, 'wptemp_deactivate_cleanup');

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

1. Для теста можно вызвать функцию вручную:

wptemp_cleanup_empty_woocommerce_sessions();

2. Проверьте таблицу wp_woocommerce_sessions через phpMyAdmin или WP-CLI:

SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_value = '' OR session_value IS NULL;

3. Убедитесь, что количество пустых сессий значительно уменьшилось.

4. Посмотрите в лог ошибок, если включён WP_DEBUG, для подтверждения срабатывания функции.

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

  • Ошибка: WP-Cron не запускается автоматически.
    Причина: На сайте низкий трафик или отключён системный Cron.
    Решение: Настройте системный Cron для вызова wp-cron.php или запускайте вручную через WP-CLI: wp cron event run --due-now.
  • Ошибка: Функция не удаляет все пустые сессии.
    Причина: В сессиях пустые корзины сериализованы как 'a:0:{}', а в запрос не добавлен этот вариант.
    Решение: Добавьте проверку на 'a:0:{}' как показано в коде.
  • Ошибка: Ошибка доступа к базе данных.
    Причина: Ошибка в префиксе таблицы или правах пользователя БД.
    Решение: Проверьте правильность $wpdb->prefix и права пользователя БД.

Практические советы по оптимизации и безопасности

  • Регулярно мониторьте размер таблицы wp_woocommerce_sessions и время выполнения очистки.
  • Включайте WP_DEBUG и смотрите логи по расписанию, чтобы убедиться в отсутствии ошибок.
  • Если сайт имеет большой трафик, рассмотрите вариант запуска очистки через системный Cron для надёжности.
  • Не удаляйте вручную сессии без проверки, так как можно потерять активные корзины пользователей.

Сравнение вариантов очистки пустых корзин WooCommerce

МетодОписаниеПлюсыМинусы
Плагин (например, Clearfy Pro)Автоматическая очистка и оптимизация базыПростота настройки, дополнительные функции оптимизацииЗависимость от стороннего плагина, возможные конфликты
Кастомный WP-CronСвой код для удаления пустых сессий ежедневноКонтроль и прозрачность, отсутствие лишних плагиновТребует поддержки и проверки cron, возможно пропуск из-за низкого трафика
Ручной SQL-запросВыполнение удаления напрямую в базе данныхМгновенный результатРиск потерять активные сессии, требует админских знаний
Как создать и использовать шорткоды в WordPress
05.11.2025
Использование WooCommerce хуков для динамического изменения цен товаров
22.04.2026
WooCommerce: автоматическое удаление пустых корзин (сессий) без плагинов
14.07.2026
Как использовать WooCommerce хуки для автоматического изменения стоимости доставки
30.05.2026
Как использовать WP REST API для создания простого плагина в WordPress
12.02.2026