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

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

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

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

Шаг 1. Регистрация задачи Cron

Добавим функцию, которая запланирует событие wp_delete_cancelled_orders в WordPress Cron, если оно ещё не запланировано.

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

Шаг 2. Создание функции удаления заказов

Создадим функцию, которая найдет отменённые заказы старше 7 дней и удалит их из базы.

function delete_cancelled_orders() {
    $args = [
        'limit'        => -1,
        'status'       => 'cancelled',
        'date_modified' => '<' . ( time() - WEEK_IN_SECONDS ),
        'return'       => 'ids',
    ];

    $orders = wc_get_orders( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}
add_action( 'wp_delete_cancelled_orders', 'delete_cancelled_orders' );

Шаг 3. Проверка работы Cron

Для отладки рекомендуем использовать плагин WP Crontrol, который позволит увидеть и запустить Cron задачи вручную.

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

  • Создайте тестовый заказ в статусе cancelled, которому более 7 дней (можно изменить дату в базе для теста).
  • Запустите событие wp_delete_cancelled_orders вручную через WP Crontrol.
  • Проверьте, что заказ удалён из базы (раздел WooCommerce → Заказы).
  • Убедитесь, что новые отменённые заказы остаются, пока не достигнут 7 дней.

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

  • Заказы не удаляются: проверьте, что статус заказа действительно cancelled, а не, например, failed или refunded. Используйте wc_get_orders с правильными аргументами.
  • Задача Cron не запускается: убедитесь, что WordPress Cron работает на вашем хостинге. На некоторых серверах требуется реальный системный Cron для надежности.
  • Удаление не происходит из-за прав: функция wp_delete_post с флагом true удаляет пост без перемещения в корзину, но если есть ограничения на уровне базы, это может блокироваться.
  • Неправильный формат времени в параметре date_modified: wc_get_orders принимает даты в формате YYYY-MM-DD HH:MM:SS, нельзя передавать timestamp напрямую.

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

  • Рекомендуется не удалять сразу все отменённые заказы, а ограничивать выборку по дате, чтобы не создавать нагрузку на базу.
  • Для надежной работы Cron используйте системный Cron, который вызывает wp-cron.php раз в час или день.
  • Если заказов много, разбивайте удаление на чанки, чтобы избежать превышения лимитов PHP.
  • Перед удалением сделайте резервную копию базы, особенно если заказы содержат важные данные.

Исправленный код удаления с учетом формата даты и чанков

function delete_cancelled_orders() {
    $date = date( 'Y-m-d H:i:s', time() - WEEK_IN_SECONDS );
    $args = [
        'limit'        => 50, // удаляем по 50 заказов за раз
        'status'       => 'cancelled',
        'date_modified' => '<' . $date,
        'return'       => 'ids',
    ];

    $orders = wc_get_orders( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}
add_action( 'wp_delete_cancelled_orders', 'delete_cancelled_orders' );

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

МетодПреимуществаНедостатки
Плагин (например, WP Rocket, Clearfy Pro с очисткой базы)Простота использования, интерфейс, поддержкаДополнительные нагрузки, платные функции
Реализация через WordPress Cron и кодГибкость, контроль, бесплатноТребуется техническая экспертиза, возможность ошибок
Ручное удаление через админкуПростота, без кодаТрудозатратно, неэффективно при большом объёме
WooCommerce: автоматическое изменение статуса заказа по условиям
07.05.2026
Как избежать ошибки PHP memory limit в WordPress: практические решения
02.02.2026
Как настроить отключение автоматических обновлений в WordPress
01.03.2026
Оптимизация базы данных WordPress: практические советы и методы
01.12.2025
Как использовать WPCommunity для создания социальной сети на WordPress
29.01.2026