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

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

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

Диагностировать проблему можно по следующим признакам:

  • Медленная загрузка страниц с заказами в админке.
  • Рост размера базы данных, особенно таблиц wp_posts и wp_postmeta.
  • Высокое время выполнения запросов к таблицам заказов.

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

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

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

function wp0_delete_cancelled_orders() {
    global $wpdb;
    // Получаем ID заказов со статусом cancelled старше 7 дней
    $order_ids = $wpdb->get_col(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < NOW() - INTERVAL 7 DAY"
    );

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

    foreach ($order_ids as $order_id) {
        // Удаляем заказ и связанные метаданные
        wp_delete_post($order_id, true);
    }
}

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

Добавляем расписание и событие в тот же файл:

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

add_action('wp0_cleanup_cancelled_orders_hook', 'wp0_delete_cancelled_orders');

Шаг 3. Проверяем наличие задачи в WP-Cron

Для проверки можно использовать плагин WP Crontrol. В разделе «Cron Events» должна появиться задача wp0_cleanup_cancelled_orders_hook, запускающаяся ежедневно.

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

  • Через 7 дней отменённые заказы старше недели должны автоматически удаляться.
  • Можно проверить таблицу wp_posts в базе данных — количество записей с post_status = 'wc-cancelled' должно уменьшаться.
  • Отсутствие ошибок в логах после срабатывания WP-Cron.

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

  • Отсутствие удаления заказов: Проверьте, что WP-Cron работает. Если сайт не получает трафик, WP-Cron может не запускаться — настройте системный cron на сервере.
  • Удаляются не те заказы: Убедитесь, что в запросе правильно указан статус wc-cancelled (с префиксом wc-), и что дата сравнивается корректно.
  • Проблемы с производительностью при удалении большого числа заказов: Реализуйте удаление партиями, например по 50 заказов за раз, чтобы избежать таймаутов.

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

  • Используйте wp_delete_post($order_id, true) с параметром true для полного удаления без помещения в корзину, чтобы не накапливать мусор.
  • Перед внедрением на боевом сайте протестируйте код на локальной копии или staging-сервере.
  • Регулярно создавайте резервные копии базы данных, особенно перед автоматическим удалением данных.
  • Если магазин большой, рассмотрите возможность удаления отменённых заказов с помощью WP CLI, что эффективнее и не зависит от WP-Cron.

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

МетодОписаниеПлюсыМинусы
WP-Cron с функцией удаленияАвтоматический запуск задачи через WP-CronЛегко настроить, работает без дополнительного ПОЗависит от трафика, возможны задержки
Системный Cron + WP CLIЗапуск регулярного скрипта с помощью системного cron и WP CLI командБолее надёжно, не зависит от трафикаТребует доступа к серверу и знаний командной строки
Плагины очисткиГотовые решения для удаления заказовПростота использованияМогут быть избыточными или конфликтовать с другими плагинами

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