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

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

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

  • Большое количество заказов в статусах pending, failed или cancelled.
  • Корзины пользователей, оставшиеся без оформления заказа более 24-48 часов.
  • Замедленная работа админ-панели при обработке заказов.

Для проверки актуального состояния можно выполнить SQL-запрос через phpMyAdmin или WP-CLI:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled');

Для корзин можно оценить таблицу wp_woocommerce_sessions, где хранятся сессии пользователей с их корзинами:

SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP() - 172800;

Где 172800 — 48 часов в секундах.

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

1. Удаление неактивных заказов по срокам

Добавим в файл functions.php или в кастомный плагин следующий код для удаления заказов со статусами pending, failed, cancelled, созданных старше N дней (например, 7):

function wc_delete_old_orders() {
    $days = 7; // Период в днях
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed', 'wc-cancelled'),
        'date_query'     => array(
            array(
                'before' => $date,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}
// Запуск через WP-Cron один раз в сутки
add_action('wc_daily_cleanup', 'wc_delete_old_orders');
// Регистрация события при активации темы/плагина
if (!wp_next_scheduled('wc_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_cleanup');
}

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

Корзины в WooCommerce хранятся в сессиях в таблице wp_woocommerce_sessions. Вручную очистить их можно так:

global $wpdb;
$time_limit = time() - 172800; // 48 часов назад
$wpdb->query($wpdb->prepare(
    "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
    $time_limit
));

Для автоматизации добавим функцию с кроном:

function wc_delete_expired_sessions() {
    global $wpdb;
    $time_limit = time() - 172800; // 48 часов
    $wpdb->query($wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
        $time_limit
    ));
}
add_action('wc_daily_cleanup_sessions', 'wc_delete_expired_sessions');
if (!wp_next_scheduled('wc_daily_cleanup_sessions')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_cleanup_sessions');
}

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

  • Перед внедрением создайте резервную копию базы данных.
  • После работы скриптов проверьте количество заказов в нужных статусах через админку или SQL-запрос.
  • Убедитесь, что таблица wp_woocommerce_sessions уменьшилась по количеству записей с просроченными сессиями.
  • Для проверки запуска событий WP-Cron можно использовать плагин Clearfy или WP Crontrol.

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

  • Крон не запускается: WP-Cron зависит от посещений сайта. Для надежности настройте системный cron на сервере или используйте плагины типа WP Crontrol.
  • Удаление не происходит: Проверьте, что статус заказа указан правильно с префиксом wc-, например wc-pending, а не просто pending.
  • Удаляются важные заказы: Убедитесь, что период удаления не слишком короткий. Рекомендуется не менее 7 дней.
  • Ошибки в запросах SQL: Используйте подготовленные выражения через $wpdb->prepare для безопасности.

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

  • Перед удалением заказы полностью удаляются с помощью wp_delete_post($order_id, true);, что очищает метаданные и связанные записи.
  • Автоматизация через WP-Cron позволяет уменьшить нагрузку, выполняя задачу в не пиковое время.
  • Не устанавливайте слишком короткие интервалы для удаления — это может привести к ошибкам и неудобствам для покупателей.
  • Используйте кеширование и оптимизацию базы данных, например с помощью плагина Clearfy, чтобы дополнительно ускорить работу с заказами и корзинами.

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

МетодПреимуществаНедостаткиПрименение
Ручное удаление в админке Контроль над каждым заказом Затратно по времени при большом объеме Малые магазины, редкие случаи
SQL-запросы напрямую Быстрое массовое удаление Риск ошибки, требует навыков Опытные администраторы
Автоматизация через WP-Cron и код Регулярная очистка без участия Зависит от работы WP-Cron и правильности кода Средние и крупные магазины
Плагины очистки Простота внедрения, GUI Могут нагружать базу, не всегда гибкие Для пользователей без навыков программирования
Как автоматизировать создание и размещение видео в WordPress с помощью OmniVideo
05.04.2026
Как удалить старые медиа файлы из библиотеки WordPress
08.12.2025
Как создать автоматические заголовки для постов в WordPress с помощью AI
04.03.2026
WooCommerce: автоматическая отправка счетов-фактур по email покупателям
29.04.2026
Как автоматизировать обновление контекста в Gutenberg с помощью AI
07.03.2026