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

Диагностика проблемы: зачем удалять заказы со статусом «Отказ от оплаты»

В WooCommerce после оформления заказа статус может остаться «Отказ от оплаты» (failed) или «Ожидает оплаты» (pending), если клиент не завершил оплату. Такие заказы накапливаются в базе, увеличивают таблицу заказов и могут влиять на отчёты и аналитику. Важно регулярно очищать систему от таких «мертвых» заказов, особенно на больших магазинах.

Пошаговое решение: автоматическое удаление заказов со статусом «failed» через WP-Cron

1. Добавление кастомного WP-Cron события

Создадим событие, которое будет срабатывать раз в сутки и запускать функцию удаления заказов.

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

2. Функция удаления заказов

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

function wpteam_cleanup_failed_orders() {
    $days = 3; // заказы старше 3 дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'status' => 'failed',
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление из базы
    }
}
add_action('wpteam_cleanup_failed_orders_hook', 'wpteam_cleanup_failed_orders');

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

Для проверки работы кода:

  • Создайте тестовый заказ со статусом «failed» старше 3 дней (можно вручную изменить дату в базе или временно уменьшить срок в коде до 0 дней).
  • Запустите вручную событие WP-Cron с помощью плагина WP Crontrol или вызовите функцию wpteam_cleanup_failed_orders() напрямую.
  • Проверьте, что заказ удалён (нет в списке заказов в админке, отсутствует в базе данных в таблице wp_posts с типом shop_order).

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

  • WP-Cron не запускается автоматически: на некоторых хостингах WP-Cron зависит от посещений сайта. Для гарантированной работы настройте системный cron на сервере или используйте плагин WP Crontrol для ручного запуска.
  • Заказы не удаляются: проверьте права пользователя, под которым запускается WordPress, и убедитесь, что функция wp_delete_post вызывается с флагом true для полного удаления.
  • Удаляются неправильные заказы: перед применением функции убедитесь, что фильтр даты и статуса правильно настроен во избежание удаления активных или оплаченных заказов.

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

  • Резервные копии. Перед автоматическим удалением заказов убедитесь, что регулярно создаются резервные копии базы данных, чтобы можно было восстановить ошибочно удалённые данные.
  • Ограничение выборки. Для магазинов с большим количеством заказов добавьте пагинацию или ограничьте число удаляемых заказов за один запуск, чтобы не перегружать сервер.
  • Логирование. Для отладки полезно логировать ID удалённых заказов в отдельный файл, чтобы отслеживать изменения.
  • Проверка статуса оплаты. Можно расширить фильтр и удалять только заказы с конкретными методами оплаты или метаданными, чтобы обезопасить важные данные.

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

ПодходПлюсыМинусы
Плагин (например, WooCommerce Order Cleaner)Простой интерфейс, настройки времени и условий удаленияДополнитель нагрузка, может конфликтовать с другими плагинами
Код с WP-Cron (решение в статье)Легковесно, полностью под контролем, можно кастомизироватьТребует навыков, нужно мониторить работу cron
Ручное удаление через админкуПростой способ без кодаНепрактично при большом количестве заказов
Как отключить дубли архивов, тегов и авторов в WordPress без поломки индексации
19.08.2026
Как закрыть тонкие страницы поисковых фильтров в WordPress без потери полезной индексации
22.08.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.