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

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

В WooCommerce накопление просроченных заказов (например, «ожидают оплату» больше 7 дней) может привести к загромождению базы данных и затруднить управление заказами. Автоматическое удаление таких заказов помогает поддерживать базу в чистоте, улучшить производительность и упростить обработку актуальных заказов.

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

1. Добавление пользовательской функции удаления

В файл функций темы (functions.php) или в кастомный плагин добавьте следующий код. Он удалит все заказы со статусом pending, созданные более 7 дней назад.

function wc_delete_expired_pending_orders() {
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders( $args );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

2. Создание задачи cron для регулярного запуска

Добавьте в тот же файл код для регистрации задачи, которая будет запускаться ежедневно:

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

add_action( 'wc_delete_expired_orders_hook', 'wc_delete_expired_pending_orders' );

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

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

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

  • Перейдите в WooCommerce → Заказы и отфильтруйте по статусу «Ожидает оплаты»;
  • Проверьте, что заказы старше 7 дней удалены;
  • Для теста можно временно изменить условие 'date_created' =< time() - 60 (1 минута) и запустить функцию вручную через WP-CLI или привязать к экшену;
  • Логи ошибок сервера не должны содержать ошибок, связанных с функцией удаления.

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

  • Заказы не удаляются: проверьте, что cron работает (используйте плагин WP Crontrol для отладки). Убедитесь, что функция wc_get_orders возвращает корректные заказы.
  • Удаляются не те заказы: внимательно проверьте параметры фильтрации, особенно статус и дату создания. Добавьте журналирование для отладки.
  • Удаление вызывает ошибки базы данных: проверьте права пользователя базы данных и наличие плагинов, которые могут блокировать удаление заказов.
  • Задача cron не запускается: убедитесь, что вызов wp_schedule_event происходит на хук wp и что сайт получает трафик для срабатывания cron.

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

  • Используйте wp_delete_post( $order_id, true ) с параметром true для полного удаления без помещения в корзину;
  • Ограничьте выборку заказов небольшими порциями, если заказов очень много, чтобы избежать превышения лимитов памяти и времени выполнения скрипта;
  • Для более надежного запуска cron можно настроить системный cron на сервере, вызывающий wp-cron.php;
  • Следите за правами доступа к функциям удаления, чтобы код не запускали пользователи без соответствующих прав.

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

МетодПлюсыМинусы
WP Cron с пользовательским кодомГибкость, нет зависимости от плагинов, полный контрольЗависит от посещаемости сайта, требует навыков программирования
Плагины автоматического удаленияПростота настройки, готовые решенияДополнительная нагрузка, возможные конфликты, ограниченная кастомизация
Системный cron + WP CronНадежность запуска, не зависит от посещаемостиТребует доступа к серверу, настройки хостинга
Как создать автоматический раздел постов в WordPress по дате и категории
08.03.2026
Автоматическое удаление товаров с нулевым запасом в WooCommerce
19.04.2026
WooCommerce: как автоматически отключить товары без запаса
07.05.2026
Как отключить или временно деактивировать плагин в WordPress без удаления
30.12.2025
Как создать собственный вид записи в WordPress для специфических типов данных
15.12.2025