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

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

Забытые корзины и незавершённые заказы на WooCommerce накапливаются в базе данных, занимая место и замедляя работу сайта. Особенно это заметно на больших магазинах с большим трафиком. Кроме того, старые заказы могут загромождать панели администрирования, усложняя управление продажами и анализ.

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

SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_key IS NOT NULL;

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY);

Первый запрос показывает количество «сессий» корзин, второй — незавершённых заказов старше 7 дней.

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

1. Автоматическое удаление сессий корзины

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

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

function clear_old_woocommerce_sessions() {
    global $wpdb;
    $expiration = 48 * HOUR_IN_SECONDS; // 48 часов
    $threshold = time() - $expiration;
    $table = $wpdb->prefix . 'woocommerce_sessions';

    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $table WHERE session_expiry < %d",
            $threshold
        )
    );
    return $deleted;
}

if ( ! wp_next_scheduled( 'clear_woocommerce_sessions_hook' ) ) {
    wp_schedule_event( time(), 'hourly', 'clear_woocommerce_sessions_hook' );
}
add_action( 'clear_woocommerce_sessions_hook', 'clear_old_woocommerce_sessions' );

Этот код удаляет сессии старше 48 часов каждый час.

2. Автоматическое удаление старых незавершённых заказов

Незавершённые (например, со статусом wc-pending или wc-cancelled) заказы старше определённого срока можно удалять автоматически.

Добавьте следующий код:

function delete_old_pending_orders() {
    $days = 7; // удалять заказы старше 7 дней
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-cancelled'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => "$days days ago",
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // без возможности восстановления
    }
}

if ( ! wp_next_scheduled( 'delete_old_pending_orders_hook' ) ) {
    wp_schedule_event( time(), 'daily', 'delete_old_pending_orders_hook' );
}
add_action( 'delete_old_pending_orders_hook', 'delete_old_pending_orders' );

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

  • Через час после добавления кода проверьте таблицу wp_woocommerce_sessions — количество записей должно уменьшиться.
  • Через сутки проверьте наличие старых заказов с помощью запроса SQL или в админке WooCommerce — заказы старше 7 дней со статусами wc-pending и wc-cancelled должны быть удалены.
  • Для проверки работы WP-Cron можно использовать плагин WP Crontrol или вызвать хук вручную через консоль WP-CLI:
wp cron event run clear_woocommerce_sessions_hook
wp cron event run delete_old_pending_orders_hook

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

  • WP-Cron не запускается на сервере: некоторые хостинги блокируют WP-Cron. Решение — настроить системный cron для вызова wp-cron.php или использовать реальные cron задачи.
  • Удаление заказов не работает: проверьте, что у пользователя, под которым запускается WP, есть права на удаление заказов. Также убедитесь, что не стоит плагин, запрещающий удаление заказов.
  • Удаление сессий не влияет на корзины: корзина может храниться в куках браузера. Убедитесь, что сессии очищаются, и браузер не сохраняет старые данные.

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

  • Регулярное удаление старых данных уменьшает размер базы и ускоряет запросы.
  • Не удаляйте заказы, которые могут быть нужны для отчетности без резервной копии.
  • Для крупных магазинов с миллионами записей рекомендуем использовать серверные cron задачи, а не WP-Cron.
  • Обязательно делайте резервные копии перед включением автоматического удаления.

Сравнение вариантов реализации автоматического удаления

Метод Плюсы Минусы Рекомендации
WP-Cron с хуками (код в functions.php) Простота реализации, не требует доступа к серверу Зависит от посещений сайта, может не запускаться вовремя Подходит для небольших и средних сайтов
Настройка системного cron с WP-CLI Надежность и точность запуска, подходит для больших сайтов Требует доступа к серверу и базовых навыков работы с консолью Рекомендуется для крупных WooCommerce магазинов
Плагины для очистки базы Удобный интерфейс, дополнительные функции оптимизации Могут быть избыточными, нагрузка на сайт Использовать с осторожностью, проверять совместимость
Как добавить кастомный виджет в WordPress с поддержкой настроек и стилей
11.02.2026
Как оптимизировать загрузку шаблонов WordPress для улучшения производительности
15.01.2026
Как сделать автоматический отчёт по ошибкам WordPress с уведомлениями
05.03.2026
Как настроить автоматическое удаление забытых корзин в WooCommerce
10.05.2026
Как отладить проблемы с производительностью WordPress
08.11.2025