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

Диагностика задачи: зачем и когда нужно удалять заказы автоматически

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

Часто пользователи спрашивают: как настроить удаление заказов старше 30, 60 или 90 дней без использования сторонних плагинов или с минимальными зависимостями. Ниже рассмотрим конкретные технические решения.

Как определить заказы, подлежащие удалению

Для удаления по сроку нужно учитывать статус заказа и дату его создания. Обычно удаляют заказы со статусами cancelled, failed, refunded или completed, если они уже не актуальны.

Пример запроса для выборки заказов старше 60 дней со статусом cancelled:

$args = [
    'status' => 'cancelled',
    'date_created' => '<' . ( new WC_DateTime( '-60 days' ) )->format( 'Y-m-d H:i:s' ),
    'limit' => -1,
];
$orders = wc_get_orders( $args );

Этот код возвращает все отмененные заказы, созданные более 60 дней назад.

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

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

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

    foreach ( $statuses as $status ) {
        $args = [
            'status' => $status,
            'date_created' => '<' . ( new WC_DateTime( "-{$days} days" ) )->format( 'Y-m-d H:i:s' ),
            'limit' => -1,
            'return' => 'ids',
        ];
        $order_ids = wc_get_orders( $args );

        foreach ( $order_ids as $order_id ) {
            wp_delete_post( $order_id, true ); // принудительное удаление
        }
    }
}

2. Регистрируем WP-Cron задачу для запуска ежедневно

add_action( 'wpdream_daily_order_cleanup', 'wpdream_delete_old_orders' );

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

3. Отключаем задачу при деактивации темы или плагина

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

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

  • Запустите cron вручную через WP CLI: wp cron event run wpdream_daily_order_cleanup
  • Проверьте таблицу wp_posts с типом shop_order на наличие заказов со статусом, которые должны удаляться, и с датой старше 60 дней — они должны исчезнуть после выполнения.
  • Для отладки добавьте логирование в функцию удаления, например, запись ID удалённых заказов в файл или в системный лог.

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

  • Удаление не происходит: Проверьте, что WP-Cron работает (например, установите плагин WP Crontrol для мониторинга задач). Если cron не запускается, настройте системный cron через хостинг.
  • Заказы не удаляются полностью: Используйте wp_delete_post( $order_id, true ) с параметром true для принудительного удаления без помещения в корзину.
  • Удаляются не те заказы: Проверьте правильность статусов и даты в запросе wc_get_orders(). Например, иногда заказы могут иметь статус processing, их не стоит удалять без проверки.
  • Высокая нагрузка при удалении большого количества заказов: Реализуйте удаление партиями, например, по 50 заказов за раз, чтобы избежать таймаутов.

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

  • Не удаляйте заказы со статусом completed или processing без веских причин — это может привести к потере данных по продажам.
  • Создайте резервную копию перед запуском автоматического удаления.
  • Для больших магазинов рассмотрите использование WP CLI скриптов для пакетной очистки, которые можно запускать вручную или по расписанию системным cron.
  • Если используете Clearfy Pro от WPShop, можно дополнительно оптимизировать базу и удалить дублирующуюся метаинформацию у заказов.

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

МетодПлюсыМинусы
WP-Cron + wc_get_orders + wp_delete_postПолный контроль, гибкость по статусам и срокам, без сторонних плагиновЗависит от корректной работы WP-Cron, может нагружать сайт при большом количестве заказов
WP CLI скрипт удаления заказовОчень быстро, не зависит от WP-Cron, подходит для больших базТребует доступа к серверу и знаний WP CLI
Плагины (например, WooCommerce Cleanup)Простота настройки, GUI, дополнительные функцииМожет влиять на производительность, меньше гибкости
Как удалить неиспользуемые метаданные из базы данных WordPress
20.02.2026
Отключение возврата товаров в WooCommerce: пошаговое руководство
03.05.2026
Как использовать WPCommunity для создания собственного форума на WordPress
03.01.2026
Как добавить просмотры и лайки в WordPress без плагинов
30.12.2025
Как удалить старые изображения в WordPress без плагинов: практическое руководство
14.04.2026