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

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

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

Как понять, что у вас есть просроченные заказы

  • В админ-панели WooCommerce откройте Заказы и отфильтруйте по статусам «Ожидает оплаты» (pending) или «Отменён» (cancelled).
  • Проверьте дату создания заказа. Если заказ висит больше 7-14 дней без изменений — он считается просроченным.
  • Можно быстро найти такие заказы SQL-запросом к базе данных (wp_posts):
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-cancelled') AND post_date < NOW() - INTERVAL 14 DAY;

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

1. Создаём функцию удаления просроченных заказов по крону WordPress

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

function wc_delete_expired_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-cancelled'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '14 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $expired_orders = get_posts($args);

    foreach ($expired_orders as $order_id) {
        wp_delete_post($order_id, true); // true - удаление без корзины
    }
}

2. Регистрируем событие wp_cron для регулярного запуска

Чтобы функция запускалась автоматически, зарегистрируем крон-событие. Добавьте следующий код:

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');

add_action('wc_cleanup_expired_orders_hook', 'wc_delete_expired_orders');

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

  • Выполните вручную функцию wc_delete_expired_orders() через отладчик или WP-CLI (wp eval 'wc_delete_expired_orders();') и проверьте, что заказы удалились.
  • Подождите следующий запуск по расписанию (ежедневно) и убедитесь, что новые просроченные заказы удаляются автоматически.
  • Проверьте раздел Заказы в WooCommerce — заказы старше 14 дней с нужными статусами должны исчезнуть.

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

  • Заказы не удаляются: проверьте, зарегистрирован ли крон (wp_cron) на вашем сайте. Для теста можно вызвать функцию вручную.
  • Удаляются не те заказы: обратите внимание на фильтр post_status и параметр date_query, они должны точно соответствовать вашей бизнес-логике.
  • Ошибка прав доступа: функция wp_delete_post требует, чтобы текущий пользователь имел соответствующие права. При запуске через крон это обычно не проблема.
  • Нагрузка на сайт: если заказов очень много, удаляйте их партиями, добавив ограничение posts_per_page и реализовав постраничное удаление.

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

  • Перед удалением заказов убедитесь, что нет юридических или бухгалтерских требований хранить их определённый период.
  • Создайте резервную копию базы данных перед внедрением автоматического удаления.
  • Если количество заказов большое, используйте пакетное удаление, например, по 50 заказов за один проход, чтобы не перегружать сервер:
function wc_delete_expired_orders_batch($batch_size = 50) {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-cancelled'),
        'date_query'     => array(
            array('column' => 'post_date', 'before' => '14 days ago'),
        ),
        'posts_per_page' => $batch_size,
        'fields'         => 'ids',
    );

    $expired_orders = get_posts($args);
    if (!$expired_orders) return false;

    foreach ($expired_orders as $order_id) {
        wp_delete_post($order_id, true);
    }
    return true;
}
  • Для автоматизации вызовите эту функцию в цикле при нескольких крон-запусках.
  • Держите логи удаления для аудита, например, записывая ID удалённых заказов в файл.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админку Простота, без кода Трудозатратно, риск пропуска Малое количество заказов
WP-Cron с кастомной функцией (код) Автоматизация, гибкость, контроль Нужны знания PHP, настройка крон Средние и крупные магазины
Плагины очистки WooCommerce Удобство, готовые функции Зависимость от стороннего кода, нагрузка Быстрый старт без разработки
Как отключить Emoji в WordPress для ускорения загрузки сайта
15.03.2026
Как создать динамический фильтр товаров в WooCommerce без плагинов
09.01.2026
Как сделать автоподсказку в WordPress для поиска
20.12.2025
Как установить ограничения на сообщения в комментариях WordPress
01.02.2026
Автоматическое удаление старых записей в WordPress через wp_cron
16.04.2026