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

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

Магазины на WooCommerce с большим потоком заказов часто сталкиваются с проблемой накопления неактивных или брошенных заказов. Такие заказы занимают место в базе данных, замедляют отчеты и усложняют администрирование. К неактивным можно отнести заказы в статусах pending, failed или on-hold, которые не меняются длительное время, например, более 30 дней.

Ручное удаление заказов неудобно и рискованно — можно нечаянно удалить важные данные. Автоматизация решения через Cron и кастомный PHP-код позволяет поддерживать базу данных в чистоте без лишних затрат времени.

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

1. Создаем функцию для удаления заказов

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

function wpzen_delete_inactive_orders() {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }

    $days = 30; // Пороговое значение в днях
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'limit' => -1,
        'status' => array( 'pending', 'failed', 'on-hold' ),
        'date_modified' => '<' . $date_threshold,
        'return' => 'ids',
    );

    $query = new WC_Order_Query( $args );
    $orders = $query->get_orders();

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            $order->delete( true ); // Полное удаление
        }
    }
}

2. Регистрируем событие Cron

Чтобы функция выполнялась регулярно, добавим wp-cron событие. В functions.php добавьте:

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

add_action( 'wpzen_delete_inactive_orders_event', 'wpzen_delete_inactive_orders' );

Это запустит удаление каждый день.

3. Очистка при деактивации

Если вы добавляете код в плагин, полезно отменить Cron при деактивации:

function wpzen_deactivate_cron() {
    $timestamp = wp_next_scheduled( 'wpzen_delete_inactive_orders_event' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpzen_delete_inactive_orders_event' );
    }
}
register_deactivation_hook( __FILE__, 'wpzen_deactivate_cron' );

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

  • Перейдите в WooCommerce > Заказы и отфильтруйте заказы со статусами pending, failed, on-hold.
  • Проверьте, что заказы со статусом, не изменявшимся более 30 дней, исчезли.
  • Для проверки запуска Cron вручную используйте WP-CLI:
    wp cron event run wpzen_delete_inactive_orders_event
  • Или временно замените в коде wp_schedule_event на вызов функции напрямую для теста.

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

  • Функция не удаляет заказы: проверьте, что WooCommerce активен и класс WC_Order_Query доступен.
  • Заказы не соответствуют условию по дате: убедитесь, что дата изменения действительно старше 30 дней, можно увеличить значение $days для теста.
  • Cron не запускается: убедитесь, что on your site wp-cron включен и посещения сайта вызывают его. Для реального Cron на сервере настройте системный Cron, который вызывает wget https://ваш_сайт/wp-cron.php?doing_wp_cron.
  • Удаление не происходит, но ошибок нет: добавьте error_log внутри цикла удаления для отладки.

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

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

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

МетодОписаниеПлюсыМинусы
Ручное удаление через админку Удаление заказов вручную в WooCommerce Простота, нет кода Трудоемко, риск ошибок, не для больших объемов
Плагин для очистки заказов Использование готовых плагинов (например, WP-Optimize) Автоматизация, настройки через UI Может быть избыточным, нагрузка, лицензии
Кастомный PHP + Cron (наш метод) Контролируемый код, гибкость Точный контроль, нет лишних функций Требует навыков, настройка Cron
Как создать динамическую форму обратной связи на WordPress с AJAX
01.03.2026
Как избежать проблем с базой данных при массовом удалении постов в WordPress
25.02.2026
WooCommerce: автоматическое обновление статусов заказов через вебхуки
15.05.2026
Создаем собственный REST API endpoint в WordPress
22.11.2025
Как создать резервную копию WordPress с помощью PHP скрипта
30.11.2025