WooCommerce: как автоматически удалять заказы по статусу после оплаты

Почему может понадобиться автоматическое удаление заказов в WooCommerce

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

Диагностика задачи: какие заказы и когда удалять

Первым делом нужно определиться, какой статус заказов считать «оплаченным» и через какой промежуток времени их удалять. Чаще всего это статус completed или processing. Удалять сразу после смены статуса может быть рискованно, т.к. могут быть дополнительные действия (отгрузка, отправка уведомлений). Поэтому рекомендуем задавать задержку, например, удалять заказы через 24 часа после смены статуса.

Проверка статусов заказов

Для проверки всех статусов используйте следующий код в консоли или сниппете:

print_r(wc_get_order_statuses());

Вы увидите список всех доступных статусов для заказов, например:

  • wc-pending — ожидает оплаты
  • wc-processing — в обработке
  • wc-completed — выполнен
  • wc-cancelled — отменён

Пошаговое решение: удаление заказов по расписанию

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

Добавим в functions.php или в кастомный плагин следующий код, который запустит задачу очистки заказов ежедневно.

if ( ! wp_next_scheduled( 'auto_delete_paid_orders_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'auto_delete_paid_orders_daily' );
}

add_action( 'auto_delete_paid_orders_daily', 'auto_delete_paid_orders_after_payment' );

2. Функция удаления заказов по статусу и времени

Реализуем функцию, которая выбирает заказы со статусом completed старше 24 часов и удаляет их.

function auto_delete_paid_orders_after_payment() {
    $args = array(
        'limit'        => -1,
        'status'       => 'completed',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
        'return'       => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true ); // true - без возможности восстановления
        }
    }
}

3. Очистка заказов с другими статусами

Если нужна очистка и по статусу processing, можно расширить функцию:

function auto_delete_paid_orders_after_payment() {
    $statuses = array( 'completed', 'processing' );
    foreach ( $statuses as $status ) {
        $args = array(
            'limit'        => -1,
            'status'       => $status,
            'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
            'return'       => 'ids',
        );

        $orders = wc_get_orders( $args );

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

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

Чтобы проверить, что удаление работает:

  1. Создайте тестовый заказ и установите статус completed или processing.
  2. Измените дату создания заказа в базе (например, через phpMyAdmin) на дату старше 24 часов назад.
  3. Запустите вручную задачу cron, вызвав функцию auto_delete_paid_orders_after_payment() через WP-CLI или временно вызвав её в шаблоне.
  4. Проверьте в админке WooCommerce, что заказ удалён.

Если заказы не удаляются, проверьте логи ошибок и наличие wp-cron. Для запуска cron вручную используйте WP-CLI:

wp cron event run auto_delete_paid_orders_daily

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

  • Заказы не удаляются: возможно, функция cron не активна или отсутствует событие. Проверьте наличие задачи в wp_cron и правильность хука.
  • Удаляются не те заказы: проверьте статус заказов, возможно, указаны неправильные или отсутствуют фильтры по дате.
  • Удаление происходит слишком рано: увеличьте интервал задержки, например, с 1 дня до 3 дней, изменив DAY_IN_SECONDS на 3 * DAY_IN_SECONDS.
  • Удаление удаляет важные данные: используйте wp_delete_post( $order_id, true ) с осторожностью — true удаляет без восстановления.

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

  • Добавьте проверку прав пользователя, если вызываете функцию удаления вручную.
  • Используйте транзакции или логи, если хотите отслеживать удалённые заказы.
  • Для больших магазинов с тысячами заказов разделяйте удаление на части, например, удалять не более 100 заказов за один запуск, чтобы не перегружать сервер:
function auto_delete_paid_orders_after_payment() {
    $statuses = array( 'completed', 'processing' );
    $limit = 100;
    foreach ( $statuses as $status ) {
        $args = array(
            'limit'        => $limit,
            'status'       => $status,
            'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
            'return'       => 'ids',
        );

        $orders = wc_get_orders( $args );

        if ( ! empty( $orders ) ) {
            foreach ( $orders as $order_id ) {
                wp_delete_post( $order_id, true );
            }
        }
    }
}
  • Всегда тестируйте на staging-среде перед применением на боевом сайте.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Код на cron (пример выше)Собственный код для удаления заказов по статусу и времени.Точный контроль, нет лишних плагинов, минимальная нагрузка.Требует навыков PHP и понимания WooCommerce.
Плагин для очистки заказовГотовые решения с интерфейсом и настройками.Простота использования, настройки без кода.Могут быть избыточными, влиять на производительность.
Ручное удаление через админкуУдаление заказов вручную.Простота, не требует кода.Неэффективно для большого количества заказов, риски ошибок.
Как использовать PHPMailer в WordPress для отправки писем с примерами кода
15.04.2026
WooCommerce: автоматическое удаление товаров после покупки с подробной настройкой
23.05.2026
Как сделать автоматический редирект после входа в WordPress
09.04.2026
Как автоматически обновлять миниатюры в WordPress при смене размера изображений
14.03.2026
Как исключить определённые плагины из автообновлений в WordPress
01.05.2026