WooCommerce: автоматическое очищение отменённых заказов с логированием

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

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

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

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

Добавим в файл functions.php вашей темы или в отдельный плагин следующий код. Он будет искать отменённые заказы старше 7 дней, удалять их и записывать информацию в лог-файл.

function wpcource_delete_cancelled_orders_with_log() {
    $args = array(
        'status' => 'cancelled',
        'date_modified' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);
    if (empty($orders)) {
        return;
    }

    $log_file = WP_CONTENT_DIR . '/cancelled-orders-delete.log';
    $log_entries = [];

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        $data = sprintf("Deleting Order ID: %d, Date: %s, Total: %s", $order_id, $order->get_date_created()->date('Y-m-d H:i:s'), $order->get_total());
        $log_entries[] = $data;

        wp_delete_post($order_id, true); // жесткое удаление
    }

    if (!empty($log_entries)) {
        $log_text = date('Y-m-d H:i:s') . " - Deleted cancelled orders:\n" . implode("\n", $log_entries) . "\n\n";
        file_put_contents($log_file, $log_text, FILE_APPEND | LOCK_EX);
    }
}

// Запускаем очистку раз в сутки
add_action('wpcource_daily_cleanup', 'wpcource_delete_cancelled_orders_with_log');

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

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

  • Проверьте, что в базе есть отменённые заказы старше 7 дней.
  • Запустите вручную функцию, например, через do_action('wpcource_daily_cleanup'); в functions.php или вызовите из консоли WP-CLI.
  • Проверьте, что отменённые заказы удалились из админки WooCommerce.
  • Откройте файл wp-content/cancelled-orders-delete.log и убедитесь, что там записаны данные об удалённых заказах.

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

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

function wpcource_delete_cancelled_orders_with_log() {
    $args = array(
        'status' => 'cancelled',
        'date_modified' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);
    $count = count($orders);
    if ($count === 0) {
        return;
    }

    $start = microtime(true);
    $log_file = WP_CONTENT_DIR . '/cancelled-orders-delete.log';
    $log_entries = [];

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        $data = sprintf("Deleting Order ID: %d, Date: %s, Total: %s", $order_id, $order->get_date_created()->date('Y-m-d H:i:s'), $order->get_total());
        $log_entries[] = $data;

        wp_delete_post($order_id, true);
    }

    $duration = microtime(true) - $start;
    $log_text = date('Y-m-d H:i:s') . " - Deleted $count cancelled orders in " . round($duration, 2) . " seconds:\n" . implode("\n", $log_entries) . "\n\n";
    file_put_contents($log_file, $log_text, FILE_APPEND | LOCK_EX);
}

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

  • Отсутствие прав на запись в лог-файл: Убедитесь, что папка wp-content доступна для записи сервером. Иначе лог не создастся.
  • Некорректный параметр date_modified в wc_get_orders: WooCommerce не всегда корректно фильтрует по дате в параметре date_modified. Вместо этого можно фильтровать вручную через цикл, проверяя дату заказа.
  • Удаление заказов, которые ещё нужны для отчетов: Перед удалением уточните, что отменённые заказы действительно не нужны для вашей аналитики.
  • Дублирование запланированных задач: При повторной активации темы/плагина проверяйте, что событие не запланировано несколько раз, чтобы избежать многократного запуска.

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

  • Для большого количества заказов делайте удаление пакетами по 50-100 заказов, чтобы избежать превышения времени выполнения скрипта.
  • Регулярно архивируйте лог-файл и очищайте его, чтобы он не разрастался.
  • Для удобства мониторинга подключите плагин типа WP Crontrol, чтобы видеть и управлять запланированными задачами WordPress.

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

ВариантПлюсыМинусы
Удаление через WP Cron + логированиеАвтоматизация, контроль через логи, гибкость настройкиЗависит от запуска WP Cron, возможно время выполнения
Удаление вручную через админкуПростота, отсутствие кодаРучной труд, риск забыть очистить, не для больших магазинов
Удаление через внешние SQL-запросыОчень быстро, минус нагрузки на WordPressРиск повредить данные, сложность, отсутствие логов
Как установить ограничение на регистрацию пользователей WordPress по IP и времени
13.04.2026
Удаление неиспользуемых терминов таксономий в WordPress
09.02.2026
WooCommerce: как автоматически удалять отменённые заказы и товары из них
11.05.2026
Как автоматизировать удаление старого контента в WordPress
12.02.2026
WordPress: отладка и оптимизация загрузки изображений
06.12.2025

Обучение разработке на WordPress, как создавать темы, плагины. Подробнее об обучении.