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
Ручное удаление через админкуПростой способ без кодаНепрактично при большом количестве заказов

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