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

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

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

Рассмотрим, как выявить необходимость автоматического удаления:

  • В админке WooCommerce много заказов со статусом cancelled или failed, которые не нужны для статистики.
  • Время хранения заказов ограничено внутренними регламентами или законодательством.
  • Заказы с определённым статусом мешают производительности сайта и усложняют отчёты.

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

1. Создаём функцию для удаления заказов в заданном статусе

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

function wpstart_delete_old_cancelled_orders() {
    $days = 30; // возраст заказа в днях
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'status' => 'cancelled',
        'limit' => -1,
        'date_created' => '<' . $date,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление
    }
}

2. Добавляем задачу в планировщик WP-Cron

Чтобы удаление происходило регулярно, создадим событие, которое будет запускать функцию ежедневно:

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

add_action('wpstart_daily_delete_cancelled_orders', 'wpstart_delete_old_cancelled_orders');

3. Очистка планировщика при деактивации

Если вы используете кастомный плагин, не забудьте удалить задачу при его деактивации:

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

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

  • Проверьте наличие заказов со статусом cancelled, старше 30 дней, в базе данных через phpMyAdmin или в админке WooCommerce - их должно стать меньше или они должны исчезнуть после срабатывания планировщика.
  • Для проверки запуска Cron можно временно вызвать функцию вручную в админке или через WP CLI: wp eval 'wpstart_delete_old_cancelled_orders();'
  • Логи сервера и ошибок PHP не должны показывать ошибок, связанных с функцией удаления.

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

  • Заказы не удаляются: возможно, WP-Cron не срабатывает из-за низкого трафика. Используйте внешний Cron или WP CLI для запуска задач.
  • Удаляются не те заказы: перепроверьте параметр 'status' и условие даты. Для проверки используйте wc_get_orders() с теми же аргументами отдельно.
  • Проблемы с производительностью при большом количестве заказов: добавьте ограничение по количеству заказов за один запуск, например, 'limit' => 50, и используйте повторный запуск.
  • Удаление не полное: функция wp_delete_post($order_id, true) удаляет заказ полностью. Не используйте false во втором параметре, иначе заказ попадёт в корзину.

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

  • Перед автоматическим удалением создавайте резервные копии базы данных, особенно если заказы важны для бухгалтерии.
  • Для больших магазинов используйте WP CLI для запуска удаления, чтобы избежать таймаутов PHP.
  • Регулярно проверяйте логи ошибок и планировщик задач, чтобы убедиться, что автоматизация работает корректно.
  • Если нужно удалять заказы с другими статусами, расширьте функцию добавлением параметра или массива статусов.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудоёмко, риск пропустить старые заказы
Код с WP-Cron (автоматически)Автоматизация, гибкость, не требует плагиновЗависит от работы WP-Cron, требует навыков
Плагины для очистки заказовУдобный интерфейс, часто с настройкамиМожет нагружать сайт, платные версии
Как создать автоматическую резервную копию WordPress с помощью плагинов и собственного кода
20.11.2025
Автоматическое удаление старого контента в WordPress по дате и категории
21.03.2026
WooCommerce: автоматическое изменение стоимости товара при определённых условиях
29.04.2026
Автоматическое удаление спам комментариев в WordPress
27.01.2026
Как правильно удалить плагин в WordPress без остаточных данных
30.12.2025