WooCommerce: автоматическое очищение старой корзины при неоконченных заказах

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

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

Проверьте, сохраняется ли содержимое корзины после сессии пользователя. Для этого откройте разные браузеры или инкогнито-режим, добавьте товар в корзину, закройте вкладку и откройте сайт заново. Если товары остаются, значит очистка не происходит.

Почему происходит накопление старых корзин?

  • WooCommerce хранит данные корзины в cookies и в базе данных (таблица wp_woocommerce_sessions), но не удаляет их по истечении времени, если заказ не создан;
  • Пользователь может оставлять товары в корзине навсегда, что влияет на лимиты и аналитику;
  • Некоторые плагины кеширования мешают корректному обновлению корзины.

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

Для решения задачи используем WP-Cron и хук, который будет очищать корзины, в которых не было активности дольше определённого времени (например, 24 часа).

1. Добавляем функцию очистки сессий пользователей

function wpmy_clear_old_woocommerce_sessions() {
    global $wpdb;
    $session_expiration = 24 * HOUR_IN_SECONDS; // 24 часа
    $time_threshold = time() - $session_expiration;

    $table = $wpdb->prefix . 'woocommerce_sessions';

    // Удаляем сессии с last_activity меньше порога
    $deleted = $wpdb->query($wpdb->prepare(
        "DELETE FROM $table WHERE session_expiry < %d",
        $time_threshold
    ));

    if ($deleted !== false) {
        error_log("WooCommerce: удалено старых сессий корзины: " . $deleted);
    }
}
add_action('wpmy_daily_clear_woocommerce_sessions', 'wpmy_clear_old_woocommerce_sessions');

2. Регистрируем ежедневное событие WP-Cron

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

3. Дополнительно: удаление куков сессии при загрузке страницы

Чтобы корзина на стороне клиента тоже очищалась, можно добавить удаление cookie, если сессия устарела.

function wpmy_clear_session_cookie_if_expired() {
    if (isset($_COOKIE['woocommerce_cart_hash'])) {
        // Пример простой проверки, можно усложнить при необходимости
        if (time() - intval(get_option('woocommerce_session_expiration', 48 * 3600)) > 24 * 3600) {
            setcookie('woocommerce_cart_hash', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN);
            setcookie('woocommerce_items_in_cart', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN);
        }
    }
}
add_action('init', 'wpmy_clear_session_cookie_if_expired');

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

  • Дождитесь выполнения cron-задачи (можно вручную вызвать через WP-CLI wp cron event run wpmy_daily_clear_woocommerce_sessions);
  • Проверьте в базе данных таблицу wp_woocommerce_sessions — записи старше 24 часов должны быть удалены;
  • Добавьте товар в корзину, закройте браузер, зайдите спустя более 24 часов — корзина должна быть пустой;
  • Проверьте логи ошибок на предмет записей из error_log в функции очистки.

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

  • WP-Cron не срабатывает: убедитесь, что на сайте нет проблем с WP-Cron. Для проверки можно использовать плагин WP Crontrol и запустить событие вручную.
  • Удаление не работает из-за префикса таблиц: префикс $wpdb->prefix должен быть правильным, проверьте в базе данных.
  • Кеширование мешает обновлению корзины: отключите кеширование для страниц корзины и оформления заказа.
  • Cookie не удаляются: проверьте путь и домен cookie, они должны совпадать с настройками WordPress (COOKIEPATH и COOKIE_DOMAIN).

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

  • Не увеличивайте частоту cron-задач без необходимости — это может нагружать базу данных.
  • Используйте транзиенты или кеширование для других задач, чтобы минимизировать нагрузку.
  • Регулярно проверяйте таблицу wp_woocommerce_sessions на предмет роста размера и очищайте вручную при необходимости.
  • Для надежности мониторьте логи ошибок PHP и WooCommerce, чтобы быстро выявлять проблемы с сессиями.
  • Рассмотрите использование плагинов типа Clearfy Pro для дополнительной оптимизации WooCommerce и базы данных.

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

МетодПлюсыМинусыКомпромисс
WP-Cron с удалением сессий (код)Гибко, бесплатно, можно настроить времяЗависит от работы WP-Cron, требует технических навыковРекомендуется для разработчиков и опытных пользователей
Плагины очистки сессийПростота установки, готовые решенияМогут перегружать сайт, не всегда гибкиеДля новичков и быстрых решений
Ручная очистка через базу данныхПолный контроль, быстроРиск ошибок, требует доступа к БДИспользовать для экстренных случаев
WooCommerce: решение проблемы с неотображением вариаций товаров
02.06.2026
Как автоматически удалять неактивных пользователей WordPress с помощью кода
27.03.2026
Как создать и использовать собственные типы записей (Custom Post Types) в WordPress
18.12.2025
Как автоматизировать создание и удаление черновиков в WordPress
07.02.2026
WooCommerce: как автоматически удалять зависающие заказы в очереди обработки
14.05.2026