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

Почему важно очищать старые отменённые заказы в WooCommerce

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

Диагностика проблемы с накоплением отменённых заказов

Для оценки ситуации проверьте, сколько отменённых заказов хранится в базе. Это можно сделать через SQL-запрос к базе данных или используя WP-CLI:

wp post list --post_type=shop_order --post_status=wc-cancelled --field=ID | wc -l

Если число заказов в статусе wc-cancelled превышает несколько тысяч, стоит подумать об автоматизации их удаления.

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

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

function wp0_delete_old_cancelled_orders() {
    global $wpdb;

    $days = 30; // задаём возраст заказов для удаления
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // жёсткое удаление
        }
    }
}

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

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

add_action('wp0_daily_cleanup_cancelled_orders', 'wp0_delete_old_cancelled_orders');

3. Добавляем возможность отменить расписание при необходимости

function wp0_clear_scheduled_cleanup() {
    $timestamp = wp_next_scheduled('wp0_daily_cleanup_cancelled_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp0_daily_cleanup_cancelled_orders');
    }
}
// Для деактивации вызовите эту функцию вручную или в хуке деактивации плагина/темы

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

  • Запустите функцию вручную, вызвав wp0_delete_old_cancelled_orders() из консоли WP-CLI или временно добавив вызов в шаблон.
  • Проверьте количество заказов со статусом wc-cancelled до и после запуска, например, через запрос в базе или через панель WooCommerce.
  • В журнале ошибок или логах сервера проверьте отсутствие ошибок при удалении.
  • Убедитесь, что заказы, младше 30 дней, не удаляются.

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

  • Удаляются не те заказы или удаление не происходит: Проверьте правильность SQL-запроса, статус заказа и дату. Убедитесь, что статус wc-cancelled совпадает с вашей версией WooCommerce.
  • Функция не запускается по расписанию: Убедитесь, что WP-Cron работает, и на сайте есть посещения (WP-Cron зависит от трафика). Для теста можно использовать плагин WP Crontrol.
  • Ошибки памяти или таймаута: При большом количестве заказов разбивайте удаление на партии, например, по 100 заказов за раз.
  • Удалённые заказы всё ещё отображаются: Проверьте, нет ли кэширования на сайте или в админке. Очистите кэш и обновите страницу.

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

  • Всегда делайте резервную копию базы перед автоматическим удалением данных.
  • Используйте жёсткое удаление wp_delete_post($order_id, true), чтобы полностью убрать заказы и связанные метаданные.
  • Если магазин большой, разбивайте удаление на части с помощью параметров LIMIT и повторяйте процесс несколько раз.
  • Для контроля и отладки используйте плагин WP Crontrol, который покажет и позволит управлять WP-Cron задачами.
  • Настройте логирование удалённых заказов, например, записывая ID и дату удаления в отдельный файл для аудита.

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

МетодПлюсыМинусыПодходит для
Ручное удаление в админке WooCommerce Просто, не требует кода Неэффективно для большого количества заказов Малые магазины с редкими отменами
SQL-запросы напрямую к базе Быстро, можно настроить под любые условия Риск повредить базу, требует навыков SQL Опытные разработчики для единоразовой очистки
Автоматизация через WP-Cron и PHP Полностью автоматический и безопасный процесс, интегрируется в WordPress Зависит от работы WP-Cron, требует тестирования Магазины со стабильным потоком заказов и необходимостью регулярной чистки

Наш каталог плагинов WordPress