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

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

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

Стандартного функционала для автоматического удаления просроченных заказов в WooCommerce нет. Обычно администраторы удаляют такие заказы вручную, что неудобно и подвержено ошибкам.

Пошаговое решение: автоматизация удаления заказов через WP-Cron и PHP

1. Определение критериев просроченного заказа

Для удаления будем считать просроченными заказы со статусом pending или failed, которые созданы более 7 дней назад. Параметры можно изменить под свои нужды.

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

function wpset_delete_expired_orders() {
    $days = 7; // количество дней для просрочки
    $date_before = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'failed'),
        'date_created' => '<' . $date_before,
        'return'       => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // удаляем навсегда
        }
    }
}

3. Регистрация задачи в WP-Cron

Добавим событие, которое будет запускать функцию ежедневно.

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

add_action('wpset_daily_delete_expired_orders', 'wpset_delete_expired_orders');

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

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

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

  • Создайте тестовый заказ со статусом pending, выставьте дату создания старше 7 дней (можно вручную в базе или через код).
  • Запустите функцию вручную или дождитесь запуска WP-Cron (обычно ночью).
  • Проверьте, что заказ удалён из панели WooCommerce и из базы данных (таблица wp_posts с типом shop_order).
  • Для отладки можно временно добавить логирование в файл через error_log.

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

  • Заказы не удаляются: проверьте, что WP-Cron работает. Для этого можно установить плагин WP Crontrol и посмотреть запланированные задачи.
  • Удаление не навсегда: убедитесь, что wp_delete_post вызывается с параметром true, иначе заказы попадут в корзину, а не будут удалены.
  • Функция вызывается слишком часто: используйте только одно запланированное событие в сутки, чтобы не перегружать сервер.
  • Проблемы с правами: убедитесь, что пользователь, под которым выполняется код, имеет права на удаление заказов.

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

  • Не удаляйте заказы со статусами processing или completed — это реальные покупки.
  • Перед удалением можно сделать резервное копирование базы данных или экспорт заказов.
  • Если заказов много, разбивайте удаление на части, чтобы избежать таймаутов. Например, использовать limit и обрабатывать по 50 заказов за раз.
  • Для ускорения запросов используйте индексы по дате создания и статусу в базе данных.

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

МетодПлюсыМинусы
Плагин (например, WP Bulk Delete)Простой интерфейс, готовые настройкиМожет перегружать сайт, лишний плагин
Код с WP-Cron (как описано выше)Лёгкий, полностью контролируемый, без лишних плагиновТребует навыков программирования, настройка WP-Cron
Ручное удалениеПолный контроль, без риска автоматических ошибокТрудоёмко, легко забыть удалить
Как удалить неактуальные transienty в WordPress и оптимизировать кэш
23.03.2026
Как отключить системные email-уведомления WordPress без плагинов
07.04.2026
Как сделать автоматический редирект после удаления записи в WordPress
17.12.2025
Как удалить ревизии записей в WordPress без плагинов
14.12.2025
Как создать простой шорткод в WordPress с применением кода
30.11.2025