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

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

В WooCommerce скапливаются заказы с разными статусами — отменённые, просроченные, неоплаченные. Если их не удалять, база данных растёт, что снижает производительность сайта и затрудняет администрирование. Ручной удаление заказов неудобен и подвержен ошибкам.

Основная задача — автоматически удалять заказы с определёнными статусами, например, отменённые или отложенные, с задержкой в несколько дней, чтобы дать пользователю возможность передумать или исправить оплату.

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

1. Определяем статусы и задержку удаления

Выберем для примера статусы cancelled и failed. Удалять будем заказы старше 7 дней.

2. Создаём функцию очистки заказов

function wptricks_delete_old_wc_orders() {
    $statuses = array('cancelled', 'failed');
    $days_old = 7;
    $date_before = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_before,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $query = new WP_Query($args);

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

3. Запускаем функцию по расписанию через WP-Cron

Регистрируем CRON задачу, которая будет запускать очистку раз в сутки.

function wptricks_schedule_order_cleanup() {
    if (!wp_next_scheduled('wptricks_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wptricks_daily_order_cleanup');
    }
}
add_action('wp', 'wptricks_schedule_order_cleanup');

add_action('wptricks_daily_order_cleanup', 'wptricks_delete_old_wc_orders');

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

  • Проверить наличие запланированной задачи в разделе wp cron event list (через WP-CLI или плагин WP Crontrol).
  • Создать тестовые заказы со статусами cancelled и failed, датированные старше 7 дней (можно вручную изменить дату в базе или через SQL).
  • Запустить CRON вручную: do_action('wptricks_daily_order_cleanup'); и проверить, что тестовые заказы удалились.
  • Отслеживать логи ошибок PHP и WooCommerce на предмет проблем с удалением.

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

  • Заказы не удаляются: проверьте, что CRON запускается (используйте WP Crontrol), функция wp_delete_post вызывается, и статусы совпадают.
  • Удаляется не тот набор заказов: проверьте параметры WP_Query, особенно post_status и date_query. Статусы должны быть массивом.
  • Проблемы с производительностью при большом количестве заказов: используйте пагинацию в запросе, чтобы удалить партии заказов по 100 штук за раз.
  • CRON не запускается на хостинге: настройте системный cron, который вызывает wp-cron.php или используйте плагин для имитации cron.

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

  • Удаление заказов без возврата в корзину (wp_delete_post($order_id, true)) — более жёсткий метод, но освобождающий место сразу.
  • Перед удалением можно добавить логирование в файл, чтобы отслеживать удалённые ID заказов.
  • Для больших магазинов с тысячами заказов лучше запускать удаление партиями с ограничением по времени и нагрузке.
  • Регулярно оптимизируйте базу данных после массового удаления заказов.

Пример расширенного удаления с пагинацией и логированием

function wptricks_delete_old_wc_orders_batch( $batch_size = 100 ) {
    $statuses = array('cancelled', 'failed');
    $days_old = 7;
    $date_before = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array('column' => 'post_date', 'before' => $date_before),
        ),
        'fields'         => 'ids',
        'posts_per_page' => $batch_size,
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $order_id) {
            if (wp_delete_post($order_id, true)) {
                error_log("Deleted WooCommerce order ID: {$order_id}");
            }
        }
    }
    return count($query->posts);
}

function wptricks_daily_order_cleanup() {
    $batch_size = 100;
    do {
        $deleted = wptricks_delete_old_wc_orders_batch($batch_size);
    } while ($deleted === $batch_size);
}
add_action('wp', function() {
    if (!wp_next_scheduled('wptricks_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wptricks_daily_order_cleanup');
    }
});
add_action('wptricks_daily_order_cleanup', 'wptricks_daily_order_cleanup');

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

МетодПлюсыМинусы
Удаление единичных заказов вручнуюПростота, контрольДолго, неудобно для больших объёмов
WP_Query + wp_delete_post с CRONАвтоматизация, гибкость, подходит для сотен заказовПотребляет ресурсы, требует настройки CRON
SQL-запросы напрямую к базеСкорость, минимальная нагрузкаРиск повреждения данных, требует осторожности
Как создать настройку автоматического удаления спама в WordPress
28.12.2025
Как изменить автоматические сообщения WordPress
10.04.2026
WooCommerce: отключение отзывов только для незарегистрированных пользователей
30.04.2026
WooCommerce: автоматическое изменение стоимости товаров при определённых условиях
10.05.2026
WooCommerce: оформление заказа без перезагрузки страницы
13.05.2026