Диагностика проблемы: зачем удалять заказы со статусом «Отказ от оплаты»
В 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 |
| Ручное удаление через админку | Простой способ без кода | Непрактично при большом количестве заказов |