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

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

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

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

1. Создаём кастомный лог для удаления заказов

Для контроля действий рекомендуем создать отдельный лог-файл, куда будут записываться ID и дата удаления заказов. Это поможет отследить процесс и при необходимости восстановить данные.

function wc_log_cancelled_order_deletion( $order_id ) {
    if ( ! class_exists( 'WC_Logger' ) ) {
        return;
    }
    $logger = wc_get_logger();
    $context = array( 'source' => 'auto-cancelled-orders-deletion' );
    $logger->info( "Удалён заказ ID: {$order_id} - статус отменён", $context );
}

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

Добавляем функцию, которая получает все заказы со статусом 'cancelled', старше определённого количества дней (например, 30), и удаляет их с помощью стандартных функций WooCommerce.

function wc_auto_delete_cancelled_orders() {
    $days_to_keep = 30;
    $date_query = date( 'Y-m-d H:i:s', strtotime( "-{$days_to_keep} days" ) );

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

    $orders = wc_get_orders( $args );

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

    foreach ( $orders as $order_id ) {
        wc_log_cancelled_order_deletion( $order_id );
        wp_trash_post( $order_id ); // Перемещаем в корзину (безопаснее, чем сразу удалять)
    }
}

3. Запускаем функцию по расписанию с помощью WP-Cron

Добавим событие, которое будет запускать удаление заказов раз в сутки.

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

add_action( 'wc_daily_cancelled_orders_cleanup', 'wc_auto_delete_cancelled_orders' );

Проверка результата: как убедиться, что удаление работает

  • В базе данных через phpMyAdmin или аналог проверяем, что заказы со статусом 'cancelled' старше 30 дней перемещены в корзину (wp_posts.post_status = 'trash').
  • Лог-файл WooCommerce (обычно wp-content/uploads/wc-logs/) содержит записи об удалённых заказах с датами и ID.
  • В админке WooCommerce в разделе заказов отменённые заказы старше 30 дней отсутствуют или находятся в корзине.
  • Для теста можно временно уменьшить $days_to_keep в функции до 1-2 дней и проверить выполнение задачи на следующий день.

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

  • Удаление не происходит: Проверьте, что WP-Cron работает на сервере. Для этого можно использовать плагин WP Crontrol и убедиться, что событие wc_daily_cancelled_orders_cleanup запланировано.
  • Лог не создаётся: Убедитесь, что директория wp-content/uploads/wc-logs/ доступна для записи и что функция wc_get_logger() есть в вашей версии WooCommerce (требуется 3.8+).
  • Заказы удаляются слишком рано: Проверьте значение переменной $days_to_keep, установите нужное количество дней, чтобы избежать преждевременного удаления.
  • Заказы удаляются сразу, а не в корзину: Используйте wp_trash_post() вместо wp_delete_post() для безопасности. Если хотите окончательно удалить, замените на wp_delete_post( $order_id, true ).

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

  • Безопасность данных: Используйте перемещение в корзину вместо прямого удаления, чтобы при ошибке можно было восстановить заказ.
  • Производительность: Если у вас очень большой магазин, ограничьте количество заказов, удаляемых за один запуск, добавив параметр 'limit' => 50 и реализовав постепенное удаление с помощью повторных запусков WP-Cron.
  • Резервные копии: Перед внедрением автоматического удаления обязательно делайте резервные копии базы данных.
  • Мониторинг: При необходимости интегрируйте отправку уведомлений администратору при удалении заказов, например, через email или Slack.

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

МетодПлюсыМинусы
Удаление через WP-Cron с логированием (код)Полный контроль, безопасность, автоматизация, логированиеТребует навыков разработки, настройка WP-Cron
Удаление через плагин (например, WP Bulk Delete)Простота использования, интерфейсМеньший контроль, нет логирования, нагрузка при удалении
Ручное удаление в админкеПростота, не требует кодаТрудозатратно, риск пропуска заказов, нет автоматизации
Как создать динамическую форму в WordPress без плагинов
07.11.2025
WooCommerce: автоматическое удаление неактивных клиентов по времени без плагинов
25.06.2026
WooCommerce: как автоматически удалять отменённые заказы с помощью кода
04.06.2026
Как изменить размер и оптимизировать изображения в WordPress без плагинов
05.01.2026
Как автоматизировать удаление старого контента в WordPress по дате
24.02.2026

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