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

В чем проблема с неактивными корзинами и заказами в WooCommerce?

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

Типичные проявления проблемы:

  • Большой объем записей в таблицах wp_woocommerce_sessions и wp_posts с типом shop_order и статусом pending или failed.
  • Замедление работы административной панели при просмотре заказов.
  • Ошибки или некорректная статистика продаж.

Диагностика: как определить, что есть неактивные корзины и заказы

Для диагностики выполните запросы к базе через phpMyAdmin или консоль MySQL:

-- Количество сессий пользователей (корзин), которые не обновлялись более 7 дней
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 7 DAY));

-- Количество заказов в статусах pending и failed старше 7 дней
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY);

Если цифры значительные — есть смысл автоматизировать удаление или деактивацию таких записей.

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

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

Cессии хранятся в таблице wp_woocommerce_sessions с полем session_expiry. WooCommerce сам очищает их в некоторых случаях, но не всегда своевременно.

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

add_action('wp_loaded', function() {
    global $wpdb;
    $expiry_threshold = time() - 7 * DAY_IN_SECONDS;
    $deleted = $wpdb->query($wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
        $expiry_threshold
    ));
    if ($deleted !== false && defined('WP_CLI') && WP_CLI) {
        WP_CLI::log("Deleted {$deleted} expired WooCommerce sessions.");
    }
});

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

Заказы в статусах wc-pending и wc-failed старше 7 дней можно удалить или изменить их статус, чтобы они не мешали.

Пример кода для удаления таких заказов:

add_action('wp_loaded', function() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed'],
        'date_query'     => [
            'before' => date('Y-m-d', strtotime('-7 days')),
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
});

3. Настройка cron для регулярного выполнения

Чтобы код не выполнялся на каждом запросе, лучше запускать его с помощью WP-Cron. Пример регистрации задачи:

if (!wp_next_scheduled('wc_cleanup_old_orders_and_sessions')) {
    wp_schedule_event(time(), 'daily', 'wc_cleanup_old_orders_and_sessions');
}

add_action('wc_cleanup_old_orders_and_sessions', function() {
    global $wpdb;
    // Удаление сессий
    $expiry_threshold = time() - 7 * DAY_IN_SECONDS;
    $wpdb->query($wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
        $expiry_threshold
    ));
    // Удаление заказов
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed'],
        'date_query'     => [
            'before' => date('Y-m-d', strtotime('-7 days')),
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
});

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

  • Запустите вручную WP-Cron или дождитесь автоматического запуска (обычно в 00:00 по серверному времени).
  • Проверьте таблицу wp_woocommerce_sessions — количество записей должно уменьшиться.
  • В административной панели WooCommerce проверьте список заказов — устаревшие pending и failed заказы должны отсутствовать.
  • Проверьте логи сервера на наличие ошибок, связанных с удалением.

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

  • Удаление заказов не происходит: проверьте, что у пользователя, под которым запускается код, есть права на удаление постов. Также убедитесь, что WP-Cron активен и задачка запланирована.
  • Сессии не удаляются: убедитесь, что таблица wp_woocommerce_sessions действительно существует и префикс базы данных совпадает с $wpdb->prefix.
  • Производительность падает при удалении: обрабатывайте заказы пакетами по 20-50 штук, чтобы не блокировать сайт. Добавьте пагинацию в запросах.
  • Удаление заказов приводит к потере данных: по возможности делайте резервные копии базы перед запуском кода.

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

  • Регулярно очищайте старые сессии и заказы, чтобы база не разрасталась.
  • Используйте WP-Cron для планирования задач, а не запуск кода на каждом запросе.
  • Ограничьте удаление только заказами старше определенного срока (например, 7 дней), чтобы не затронуть активные покупки.
  • Если у вас большой магазин, рассмотрите использование внешних cron-задач (через системный cron), чтобы не полагаться на WP-Cron.
  • Не удаляйте заказы со статусом processing или completed, чтобы не потерять важные данные.

Сравнение вариантов удаления неактивных заказов и сессий

МетодПростота внедренияКонтрольРискиПроизводительность
Ручное удаление через SQLСредняяВысокийРиск удаления нужных данныхВысокая
Код в functions.php (на каждом запросе)ВысокаяСреднийНагрузка на сайтНизкая
WP-Cron с регулярным запускомСредняяВысокийWP-Cron может не запускаться при низком трафикеОптимальная
Системный cron + WP-CLIСложнееМаксимальныйТребует доступа к серверуОптимальная
Как автоматизировать удаление спама в комментариях WordPress
18.02.2026
Как добавить динамические фильтры в темы WordPress: практические решения
30.03.2026
Как в WooCommerce отключить корзину и сразу вести к оформлению заказа
09.08.2026
Как удалить автоматически создаваемые ревизии в WordPress
05.03.2026
Как удалить закрепленные записи в WordPress: практические способы
07.02.2026