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

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

Магазины на WooCommerce часто сталкиваются с накоплением большого числа заказов со статусами cancelled (отменён) и refunded (возврат). Такие заказы не несут коммерческой ценности, но занимают место в базе данных, замедляют админку и усложняют отчёты. Особенно это заметно при большом потоке заказов и ограниченных ресурсах хостинга.

Удаление таких заказов вручную — трудоёмкий и неэффективный процесс. Автоматизация через WP-Cron позволит систематически чистить базу и держать WooCommerce в оптимальном состоянии.

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

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

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

function wpmentor_delete_cancelled_refunded_orders() {
    // Получаем заказы со статусом cancelled и refunded старше 7 дней
    $args = array(
        'status' => array('cancelled', 'refunded'),
        'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);

    if(empty($orders)) {
        return;
    }

    foreach($orders as $order_id) {
        wp_delete_post($order_id, true); // Полное удаление без перемещения в корзину
    }
}

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

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

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

add_action('wpmentor_daily_order_cleanup', 'wpmentor_delete_cancelled_refunded_orders');

3. Удаление задачи при деактивации (рекомендуется)

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

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

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

  • В админке WooCommerce перейдите в раздел Заказы и отфильтруйте по статусам Отменён и Возврат. Убедитесь, что заказы старше 7 дней исчезают автоматически после запуска WP-Cron (обычно в течение суток).
  • Для ускоренного тестирования временно измените условие date_created в функции на 1 день или меньше и вручную вызовите функцию через do_action('wpmentor_daily_order_cleanup') в functions.php.
  • Проверьте логи сервера на наличие ошибок удаления (если используется WP_DEBUG).

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает на вашем хостинге (в некоторых случаях нужно настроить системный cron или использовать сторонний сервис).
  • Удаляются все заказы без фильтрации по дате: Убедитесь, что параметр 'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ) корректно передаётся и возвращает ожидаемые результаты.
  • Ошибка «функция wc_get_orders не найдена»: Убедитесь, что код выполняется в контексте WooCommerce (например, подключайте код через хуки после загрузки плагина WooCommerce).
  • Заказы остаются в корзине, но не отображаются в админке: Используйте wp_delete_post($order_id, true) с параметром true для полного удаления без перемещения в корзину.

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

  • Всегда делайте резервные копии базы данных перед автоматическим удалением заказов.
  • Чтобы избежать нагрузки на сервер, ограничьте количество удаляемых заказов за один запуск (например, 'limit' => 50), и запускайте WP-Cron чаще, например, каждые 6 часов.
  • Следите, чтобы код работал только в административной части и не влиял на фронтенд, чтобы не снижать производительность сайта для обычных пользователей.
  • Для более продвинутой очистки можно добавить логи удаления заказов с указанием ID и времени удаления, чтобы контролировать процесс.

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

МетодПлюсыМинусы
Ручное удаление в админке WooCommerce Просто, не требует кода Трудоёмко, не подходит для большого количества заказов
Автоматизация через WP-Cron и код (описано выше) Полностью автоматизировано, гибко настраивается Требует базовых знаний PHP и понимания WP-Cron
Плагины для очистки заказов Удобный интерфейс, дополнительные функции Может влиять на производительность, зависит от стороннего кода
Как настроить автоматическое сохранение и восстановление контента в WordPress
04.12.2025
Как автоматизировать удаление старых записей через WP-Cron в WordPress
31.01.2026
Как использовать WP-Cron для автоматического удаления нерабочих вариантов заказов WooCommerce
26.04.2026
WooCommerce: как добавить автоматическое изменение цены товара при использовании промокода
10.05.2026
Оптимизация загрузки шаблонов в WordPress для ускорения сайта
15.12.2025