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

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

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

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

Чтобы проверить, есть ли в базе заказы с отменённой оплатой:

  • В админке WooCommerce перейдите в Заказы.
  • Отфильтруйте заказы по статусу cancelled или failed.
  • Обратите внимание на количество таких заказов и дату их создания.

Если таких заказов много и они не удаляются автоматически, пора реализовать скрипт для удаления.

Пошаговое решение: автоматическое удаление заказов с отменённой оплатой через cron

1. Добавляем функцию для удаления заказов с нужным статусом

function wplist_delete_cancelled_orders() {
    $args = [
        'status' => ['failed', 'cancelled'],
        'limit' => -1,
        'date_created' => '<' . ( time() - DAY_IN_SECONDS * 1 ), // старше 1 дня
        'return' => 'ids',
    ];
    $orders = wc_get_orders( $args );

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

2. Создаём WP-Cron задачу для регулярного запуска

if ( ! wp_next_scheduled( 'wplist_delete_cancelled_orders_hook' ) ) {
    wp_schedule_event( time(), 'daily', 'wplist_delete_cancelled_orders_hook' );
}
add_action( 'wplist_delete_cancelled_orders_hook', 'wplist_delete_cancelled_orders' );

3. Добавляем код в файл functions.php активной темы или создаём небольшой кастомный плагин

Рекомендуется использовать плагин, чтобы избежать потери изменений при обновлении темы.

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

  • Создайте тестовый заказ с оплатой, затем отмените оплату или пометьте заказ статусом cancelled или failed.
  • Подождите 24 часа (или временно измените параметр date_created на меньшее значение для теста).
  • Запустите вручную wp-cron, например, через плагин WP Crontrol или через браузер, перейдя по https://example.com/wp-cron.php?doing_wp_cron.
  • Проверьте, удалён ли заказ из админки WooCommerce.

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

  • Заказы не удаляются: проверьте, запланировано ли событие wp-cron (используйте WP Crontrol или аналогичные инструменты).
  • Удаляются не те заказы: убедитесь, что в фильтре 'status' только нужные статусы (failed, cancelled).
  • Удаление происходит слишком рано: параметр date_created контролирует возраст заказа. Не ставьте слишком маленькое значение, чтобы не удалять заказы, по которым ещё могут быть платежи.
  • Проблемы с правами: функция wp_delete_post( $order_id, true ) требует прав администратора, убедитесь, что код запускается с достаточными правами.

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

  • Не удаляйте заказы моментально — оставляйте запас по времени (например, 24 часа), чтобы избежать удаления заказов с задержкой платежей.
  • Используйте return => 'ids' в wc_get_orders для оптимизации памяти.
  • Для крупных магазинов с тысячами заказов разбейте удаление на части, чтобы избежать таймаутов, например, удаляйте по 100 заказов за один запуск.
  • Резервное копирование базы перед автоматическим удалением — обязательно.
  • Проверяйте логи сервера и ошибок WordPress после внедрения для выявления сбоев.

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

ВариантПлюсыМинусы
WP-Cron с кастомной функцией (код)Гибкость, контроль, бесплатноТребует знаний PHP, возможны таймауты при большом объёме
Плагины очистки (Clearfy, другие)Простота установки, готовый функционалМогут быть избыточными, ограниченная настройка
Ручное удаление через админкуПростота, без кодаНеэффективно при большом количестве заказов
WooCommerce: как удалить отзывы только с определённых товаров
25.04.2026
Оптимизация изображений в WordPress для ускорения сайта
16.12.2025
Как добавить собственные поля в WordPress: пошаговое руководство
14.11.2025
Как удалить все старые метаданные в WordPress
09.02.2026
Как создать многоуровневое меню в WordPress: практическое руководство
02.12.2025