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

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

В крупных интернет-магазинах на WooCommerce накопление заказов со статусами cancelled (отключённые) и failed (заблокированные) приводит к увеличению размера базы данных и замедлению работы сайта. Такие заказы не влияют на работу магазина, но создают нагрузку при выборках и отчетах.

Чтобы выявить проблему, выполните запрос к базе данных через phpMyAdmin или WP-CLI:

SELECT COUNT(ID) as count, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed') GROUP BY post_status;

Если количество заказов в этих статусах превышает несколько тысяч, стоит настроить автоматическое удаление устаревших записей.

Пошаговое решение: удаление заказов по статусу с помощью WP-Cron

1. Создаём функцию удаления устаревших заказов

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

function wpscan_delete_old_cancelled_failed_orders() {
    // Определяем возраст заказов для удаления (например, 30 дней)
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем заказы со статусами cancelled и failed старше $days
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

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

2. Создаём событие WP-Cron для регулярного запуска

Добавьте регистрацию cron задачи и планировщик:

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

add_action('wpscan_daily_delete_cancelled_failed_orders', 'wpscan_delete_old_cancelled_failed_orders');

3. Тестируем функцию вручную

Для проверки запустите функцию напрямую в коде или через консоль WP-CLI:

wp eval 'wpscan_delete_old_cancelled_failed_orders();'

Убедитесь, что заказы с нужным статусом и датой удалились.

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

  • Через phpMyAdmin или WP-CLI выполните SQL-запрос из раздела диагностики, чтобы убедиться, что старые заказы удалены.
  • Проверьте логи сервера на отсутствие ошибок удаления.
  • Проверьте, что новые заказы этого типа не удаляются преждевременно.
  • Убедитесь, что cron события выполняются с помощью плагина WP Crontrol или командой wp cron event list.

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

  • Ошибка: Заказы не удаляются, хотя cron запущен.
    Причина: Функция не вызывается из-за неправильного хука или отсутствия cron задачи.
    Решение: Проверьте регистрацию cron события и наличие хука wpscan_daily_delete_cancelled_failed_orders.
  • Ошибка: Удаляются не те заказы или удаление происходит слишком рано.
    Причина: Неправильно задан параметр даты в запросе.
    Решение: Проверьте параметр $date и формат даты в запросе.
  • Ошибка: Сайт тормозит при удалении большого количества заказов.
    Причина: Удаление большого объёма данных за один запрос.
    Решение: Добавьте лимит на количество заказов для удаления за один вызов и используйте пакетную обработку.

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

  • Используйте WP-Cron вместе с системным cron для надежности выполнения задач.
  • Добавьте в функцию логирование удалённых заказов для аудита.
  • Для больших магазинов реализуйте пакетное удаление, например по 100 заказов за раз с повторным запуском задачи через короткие промежутки.
  • Всегда делайте бэкап базы перед внедрением автоматического удаления.
  • Проверьте совместимость с плагинами, которые могут использовать заказы с этими статусами для аналитики.

Пример улучшенной пакетной функции удаления

function wpscan_delete_old_orders_batch($batch_size = 100) {
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => $batch_size,
    );

    $orders = get_posts($args);
    if (empty($orders)) {
        return false; // Нет заказов для удаления
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
    return true; // Есть ещё заказы для удаления
}

Сравнение способов удаления заказов

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