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

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

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

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

Чтобы решить задачу, нужно чётко определить критерии "просроченности" заказов. Обычно это заказы со статусом pending, failed или cancelled, созданные более N дней назад. Проверить их можно SQL-запросом:

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY);

Замените 7 на нужное количество дней. Если таких заказов много, стоит автоматизировать их удаление.

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

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

Функция получает список заказов с нужными статусами и датой, затем последовательно удаляет их:

function wc_delete_expired_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed', 'wc-cancelled'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '7 days ago', // Можно настроить
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );
    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true - принудительное удаление
        }
    }
}

2. Регистрируем крон-задачу при активации темы или плагина

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

3. Привязываем нашу функцию к крон-событию

add_action('wc_cleanup_expired_orders_hook', 'wc_delete_expired_orders');

4. Очистка при деактивации (если это плагин)

function wc_clear_expired_orders_cleanup() {
    $timestamp = wp_next_scheduled('wc_cleanup_expired_orders_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_cleanup_expired_orders_hook');
    }
}

Как проверить, что автоматическое удаление работает

  1. Создайте тестовый заказ со статусом pending и датой более 7 дней назад (можно вручную в базе или через WP-CLI).
  2. Выполните крон-задачу вручную через WP-CLI: wp cron event run wc_cleanup_expired_orders_hook.
  3. Проверьте, что заказ удалён: в админке WooCommerce или через SQL-запрос.
  4. Следите за логами сервера — ошибок быть не должно.

Частые ошибки и пути их исправления

  • Заказы не удаляются: проверьте, что статус заказа корректно указан с префиксом wc- (например, wc-pending), иначе get_posts ничего не найдёт.
  • Крон-задача не запускается: убедитесь, что в WordPress работает WP-Cron (например, вызов wp-cron.php не заблокирован). Для отладки используйте плагин WP Crontrol.
  • Удаляются лишние заказы: перепроверьте параметры date_query и статусы, чтобы не потерять важные данные.
  • Перегрузка сервера при большом количестве заказов: добавьте ограничение по количеству удаляемых заказов за один запуск, например, 'posts_per_page' => 100, и используйте пагинацию.

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

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

Сравнение вариантов удаления просроченных заказов

МетодПлюсыМинусыПрименимость
Ручное удаление через админкуПростотаТрудозатратно, риск ошибкиМалые объёмы заказов
SQL-запросы напрямуюБыстроРиск повредить данные, требует бэкапаОпытные разработчики
WP-Cron с wp_delete_post()Автоматизация, безопасноЗависит от WP-CronСредние и крупные магазины
Плагины очистки базыУдобство, дополнительные функцииЗависимость от стороннего ПОЖелающие минимизировать код
Как удалить загруженные файлы в WordPress после удаления плагинов
21.01.2026
Как отладить проблемы с кешированием WordPress: эффективные методы и решения
10.11.2025
Как создать простой многоязычный сайт на WordPress без плагинов
10.12.2025
WooCommerce: автоматическое удаление просроченных заказов с помощью WP-Cron
17.07.2026
Как автоматически устанавливать приватность записей в WordPress
18.02.2026