Автоматическое удаление отключённых и неоплаченных заказов WooCommerce с помощью кода

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

WooCommerce по умолчанию не удаляет отключённые (cancelled) или неоплаченные (pending, failed) заказы. Это приводит к раздуванию базы данных, замедлению запросов и усложнению управления заказами. Многие пользователи пытаются решить проблему вручную или через плагины, но это неудобно и ненадёжно.

Чтобы понять, что заказы не удаляются автоматически, проверьте таблицу wp_posts с типом shop_order и статусами заказов. Если в базе много старых заказов с нужными статусами, значит автоматизация отсутствует.

Пошаговое решение: как автоматически удалять отключённые и неоплаченные заказы

1. Использование WP-Cron для регулярного удаления заказов

Добавим в файл functions.php или в кастомный плагин код, который удаляет заказы старше заданного срока с определёнными статусами.

function wpscan_delete_old_cancelled_and_pending_orders() {
    global $wpdb;
    $days = 30; // удалять заказы старше 30 дней
    $statuses = ['cancelled', 'pending', 'failed'];

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ($statuses as $status) {
        $orders = wc_get_orders([
            'limit' => -1,
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'return' => 'ids',
        ]);

        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true - удаление без корзины
        }
    }
}

add_action('wpscan_daily_order_cleanup', 'wpscan_delete_old_cancelled_and_pending_orders');

// Регистрируем событие для cron, если оно не существует
if (!wp_next_scheduled('wpscan_daily_order_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpscan_daily_order_cleanup');
}

2. Проверка наличия и настройка WP-Cron

Убедитесь, что WP-Cron работает на вашем сайте. Для этого можно использовать плагины типа WP Crontrol или выполнить команду через SSH:

wget -q -O - https://your-site.ru/wp-cron.php?doing_wp_cron

Если WP-Cron не работает, настройте системный cron на сервере для вызова wp-cron.php или используйте плагины, чтобы запускать задачи вручную.

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

  • Подождите сутки после добавления кода (или запустите крон вручную через WP Crontrol).
  • Проверьте базу данных, запросом в phpMyAdmin или через WP-CLI:
wp post list --post_type=shop_order --post_status=cancelled,pending,failed --field=ID

Если список заказов пуст или содержит только свежие заказы, значит удаление работает.

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

  • Код не выполняется: проверьте, что событие крон зарегистрировано (wp_next_scheduled), а WP-Cron включён и работает.
  • Удаляются не те заказы: проверьте правильность статусов, используйте консоль или дебаггер для подтверждения.
  • Потеря данных: функция wp_delete_post удаляет заказы без возможности восстановления. Для безопасности сначала протестируйте на копии сайта.
  • Перегрузка сервера: при большом количестве заказов разбивайте удаление на партии, например, по 50 заказов за раз.

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

  • Используйте wp_delete_post($order_id, true); для полного удаления, чтобы не оставлять мусор в базе.
  • Ограничьте количество заказов для удаления за один запуск, чтобы избежать таймаута:
function wpscan_delete_old_orders_batch() {
    $batch_size = 50;
    $statuses = ['cancelled', 'pending', 'failed'];
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    foreach ($statuses as $status) {
        $orders = wc_get_orders([
            'limit' => $batch_size,
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'return' => 'ids',
        ]);

        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}
  • Убедитесь, что резервные копии базы данных создаются регулярно.
  • Для больших магазинов рассмотрите использование плагинов оптимизации, например Clearfy Pro для удаления мусора и оптимизации базы данных.

Сравнение вариантов удаления заказов WooCommerce

МетодПлюсыМинусы
Ручное удаление Контроль каждого заказа Трудоёмко, риск пропуска
Плагины очистки базы Автоматизация, удобство Может конфликтовать, нагрузка
Код с WP-Cron (рекомендация) Лёгкая кастомизация, без сторонних плагинов Требует знаний, нужно следить за WP-Cron
Как автоматизировать обновление тем и плагинов WordPress с помощью кода
29.11.2025
Настройка и управление ролями пользователей в WordPress: практические решения и примеры кода
23.12.2025
Автоматическое удаление отключённых и неоплаченных заказов в WooCommerce
17.05.2026
Как защитить WordPress от приватных регистраций: капча и плагины
18.02.2026
Как защитить WordPress от атак с помощью Content Security Policy
20.12.2025