Автоматическое удаление возврашённых и отменённых заказов WooCommerce по сроку

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

В крупных интернет-магазинах на WooCommerce количество заказов с разными статусами быстро растёт, что замедляет работу сайта и увеличивает нагрузку на базу данных. Особенно остро стоит задача с заказами в статусах refunded (возврат) и cancelled (отмена), которые уже неактивны и не нужны для аналитики или отчетов.

Если не удалять такие заказы, таблица wp_posts и связанные метаданные раздуваются, что влияет на скорость запросов, бэкапов и индексацию.

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

  • Выполните SQL-запрос к базе, чтобы узнать количество заказов с статусами отменён и возврат:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded') GROUP BY post_status;
  • Если количество таких заказов превышает 1000 и старше 30 дней — есть смысл автоматизировать их удаление.

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

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

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

function wpbe_delete_old_wc_orders() {
    global $wpdb;
    $days = 30; // количество дней для хранения
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов со статусом 'cancelled' и 'refunded', старше $days
    $order_ids = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded') AND post_date < %s",
            $date_threshold
        )
    );

    if (empty($order_ids)) {
        return; // Нет заказов для удаления
    }

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

2. Запускаем функцию периодически через WP-Cron

Добавьте расписание и привяжите к нему функцию:

if (!wp_next_scheduled('wpbe_delete_old_wc_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'wpbe_delete_old_wc_orders_hook');
}
add_action('wpbe_delete_old_wc_orders_hook', 'wpbe_delete_old_wc_orders');

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

  • Запустите функцию вручную, вызвав wpbe_delete_old_wc_orders() через консоль WP-CLI или временно добавив вызов в код.
  • Проверьте, что в базе заказов со статусами wc-cancelled и wc-refunded старше 30 дней больше нет:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Результат должен быть 0.

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

  • Заказы не удаляются: проверьте, что WP-Cron работает (можно использовать плагин WP Crontrol для диагностики).
  • Удаляются не те заказы: проверьте правильность статусов. WooCommerce использует префикс wc- для статусов заказов.
  • Удаление не полное: используйте wp_delete_post($order_id, true) для полного удаления, иначе заказы попадут в корзину.
  • Проблемы с производительностью при большом количестве заказов: разбейте удаление на партии, добавив лимит и повторный запуск.

Практические советы по оптимизации и безопасности

  • Создайте резервную копию базы перед внедрением автоматического удаления.
  • Логируйте удалённые заказы, чтобы иметь возможность аудита (например, записывайте ID и дату удаления в отдельный файл или таблицу).
  • Для крупных магазинов используйте пакетное удаление по 50-100 заказов за раз, чтобы избежать таймаута.
  • Проверяйте доступность WP-Cron или настройте системный cron для надежного запуска задач.

Сравнение вариантов реализации удаления заказов

МетодПлюсыМинусыКогда использовать
WP-Cron + wp_delete_post()Простота, встроенный в WordPressЗависит от посещаемости сайта, возможны пропускиМалые и средние магазины
Системный cron + WP-CLI скриптНадежность, можно запускать независимо от сайтаТребуется доступ к серверу и настройкаКрупные проекты с большим количеством заказов
Плагины очистки базыГрафический интерфейс, дополнительные опцииМогут влиять на производительность, не всегда гибкиеБыстрая настройка без кода
WooCommerce: автоматическое удаление заказов по срокам без плагинов
01.06.2026
WooCommerce: автоматическое удаление заказов по просроченным срокам
04.06.2026
Автоматическое удаление возврашённых и отменённых заказов WooCommerce по сроку
20.05.2026
WooCommerce: настройка и использование различных методов оплаты
16.05.2026
Как добавить поддержку WebP в WordPress без плагинов
10.04.2026