WooCommerce: автоматическое отслеживание и удаление заказов по статусу

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

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

Чаще всего возникает задача автоматизировать удаление заказов по определённым статусам (например, "отменён", "отклонён", "неоплачен") спустя заданный срок.

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

  • Войдите в админку WooCommerce > Заказы;
  • Отфильтруйте заказы по статусам "отменён", "ожидание оплаты" и посмотрите дату создания;
  • Если таких заказов много и они старше 30 дней, это повод автоматизировать их удаление.

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

1. Используем WP-Cron для регулярного запуска задачи

Создадим функцию, которая будет запускаться раз в сутки и удалять все заказы со статусом cancelled и датой создания старше 30 дней.

function wponline_delete_old_cancelled_orders() {
    $args = [
        'limit'        => -1,
        'status'       => 'cancelled',
        'date_created' => '<' . ( new WC_DateTime('-30 days') )->format('Y-m-d H:i:s'),
        'return'       => 'ids',
    ];
    $orders = wc_get_orders($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление без корзины
        }
    }
}

// Регистрируем событие при активации темы/плагина
function wponline_schedule_order_cleanup() {
    if (!wp_next_scheduled('wponline_order_cleanup_hook')) {
        wp_schedule_event(time(), 'daily', 'wponline_order_cleanup_hook');
    }
}
add_action('wp', 'wponline_schedule_order_cleanup');

// Привязываем функцию к крону
add_action('wponline_order_cleanup_hook', 'wponline_delete_old_cancelled_orders');

// Очистка при деактивации
function wponline_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wponline_order_cleanup_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wponline_order_cleanup_hook');
    }
}

2. Как адаптировать под другие статусы

Для удаления заказов с другими статусами, например failed или pending, измените параметр 'status' на массив:

'status' => ['cancelled', 'failed', 'pending'],

Функция удалит заказы с любым из указанных статусов.

3. Настройка интервала и времени запуска

По умолчанию задача запускается ежедневно. При необходимости можно добавить пользовательский интервал:

add_filter('cron_schedules', function($schedules) {
    $schedules['weekly'] = [
        'interval' => 604800, // 7 дней в секундах
        'display'  => __('Once Weekly')
    ];
    return $schedules;
});

// В функции wponline_schedule_order_cleanup замените 'daily' на 'weekly'

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

  • Создайте тестовый заказ со статусом cancelled и датой создания старше 30 дней (можно использовать WP-CLI или ручную установку даты в базе);
  • Запустите событие WP-Cron вручную через плагин WP Crontrol или WP-CLI (wp cron event run wponline_order_cleanup_hook);
  • Проверьте, что заказ удалён из админки WooCommerce и из таблиц базы данных wp_posts и wp_postmeta;
  • Убедитесь, что заказы с другими статусами и младше 30 дней не удалились.

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

  • Функция не запускается по расписанию: проверьте наличие WP-Cron. На некоторых хостингах WP-Cron отключён. Можно настроить системный cron и запускать wp cron event run вручную.
  • Заказы не удаляются полностью: убедитесь, что используете wp_delete_post($order_id, true) с параметром true для полного удаления, а не в корзину.
  • Удаление происходит слишком рано или поздно: проверьте правильность сравнения даты в параметре date_created. Используйте класс WC_DateTime с корректным форматом.
  • Потеря данных при автоматическом удалении: рекомендуется делать резервные копии базы перед внедрением.

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

  • Ограничьте удаление заказов только нужными статусами и сроками, чтобы не потерять важные данные.
  • Тестируйте на копии сайта перед запуском на живом магазине.
  • Для больших магазинов с тысячами заказов используйте пагинацию в запросах, чтобы не перегружать сервер:
$paged = 1;
do {
    $args['limit'] = 100;
    $args['paged'] = $paged;
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
    $paged++;
} while (!empty($orders));
  • Если хотите автоматизировать и расширить функциональность — рассмотрите плагин Clearfy Pro от WPShop, который помогает чистить сайт, оптимизировать базу и управлять SEO.

Сравнение подходов: код vs плагины для удаления заказов

КритерийКод (как в статье)Плагин (например, Clearfy Pro)Компромисс
ГибкостьМаксимальная, можно адаптировать под любые задачиОграничена функционалом плагинаКод требует поддержки, плагин — обновлений
Простота внедренияТребует навыков PHP и доступа к сайтуУстанавливается и настраивается через админкуПлагин быстрее, код — более кастомный
ПроизводительностьКонтролируете оптимизацию самостоятельноМожет быть избыточным и замедлять сайтКод легче на ресурсы при правильной реализации
БезопасностьЗависит от качества кодаПроверена разработчиками, но может иметь уязвимостиКомбинируйте — плагин + кастомные доработки
Как добавить удалённую отладку в WordPress
29.03.2026
Удаление пустых шорткодов в WordPress: практическое руководство
17.02.2026
Как удалить пустые метаданные в WordPress для оптимизации базы данных
06.03.2026
WordPress: как создать собственную таблицу в базе данных и работать с ней
30.11.2025
Как создать автоматический импорт продукции в WooCommerce
09.04.2026