Проблема: накопление неоплаченных заказов в WooCommerce
На многих интернет-магазинах, работающих на WooCommerce, накапливаются неоплаченные заказы, которые не удаляются автоматически. Это приводит к загрязнению базы данных, усложнению учета и возможным ошибкам при аналитике и отчетах.
WooCommerce по умолчанию не удаляет заказы со статусом pending или failed, что требует ручного вмешательства или автоматизации через код.
Диагностика: как определить, что заказы не удаляются
- Зайдите в админ-панель WooCommerce → Заказы и отфильтруйте по статусам
Ожидает оплатыилиНеоплаченный. - Обратите внимание на дату создания заказов — если они старше нескольких дней и не оплачены, значит автоматического удаления нет.
- Проверьте базу данных, выполнив запрос к таблице
wp_postsc фильтром поpost_type = 'shop_order'и статусуpost_status = 'wc-pending'илиwc-failed.
Решение: автоматическое удаление неоплаченных заказов по времени
Реализуем удаление заказов старше заданного времени (например, 24 часа) со статусом pending или failed с помощью WP-Cron. Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин.
// Интервал запуска события - 1 раз в часadd_filter('cron_schedules', function($schedules) { if (!isset($schedules['hourly'])) { $schedules['hourly'] = array( 'interval' => 3600, // 1 час 'display' => 'Раз в час' ); } return $schedules;});if (!wp_next_scheduled('wpb_delete_old_unpaid_orders')) { wp_schedule_event(time(), 'hourly', 'wpb_delete_old_unpaid_orders');}add_action('wpb_delete_old_unpaid_orders', function() { global $wpdb; $interval_hours = 24; // время жизни заказа в часах $time_threshold = date('Y-m-d H:i:s', strtotime("-{$interval_hours} hours")); // Получаем ID заказов статусом pending или failed старше порогового времени $order_ids = $wpdb->get_col($wpdb->prepare(" SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-pending','wc-failed') AND post_date < %s ", $time_threshold)); if (!empty($order_ids)) { foreach ($order_ids as $order_id) { // Безопасное удаление заказа через функцию WooCommerce wp_trash_post($order_id); } }});Этот код добавляет в WP-Cron задание, которое запускается каждый час и удаляет заказы старше 24 часов с указанными статусами.
Как изменить время удаления
Измените переменную $interval_hours в коде на нужное количество часов.
Проверка результата
- Создайте тестовый заказ со статусом
pending. - Измените дату создания заказа в базе данных на дату более 24 часов назад или уменьшите
$interval_hoursдля теста. - Запустите вручную WP-Cron через плагин WP Crontrol или дождитесь автоматического запуска.
- Проверьте, что заказ удалился и больше не отображается в списке заказов.
Частые ошибки и их исправление
- Крон не запускается: Проверьте, что на сайте выполняется WP-Cron, или настройте системный cron для запуска
wp-cron.php. - Заказы не удаляются: Проверьте права пользователя, от имени которого запускается cron, и наличие функции
wp_trash_post. - Удаляются не те заказы: Убедитесь, что фильтр по статусам соответствует вашим задачам (
wc-pending,wc-failedи т.д.).
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами заказов желательно ограничить количество удаляемых заказов за один запуск, чтобы избежать таймаутов. Например, добавить
LIMIT 50в SQL-запрос и обрабатывать по частям. - Используйте
wp_trash_postвместоwp_delete_post, чтобы иметь возможность восстановить удалённые заказы при ошибках. - Регулярно проверяйте логи ошибок и работу cron, чтобы своевременно обнаружить сбои.
Сравнение способов удаления неоплаченных заказов
| Способ | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, неавтоматично |
| Плагин автоматического удаления | Удобство, настройки | Зависимость от стороннего кода, нагрузка |
| Кастомный WP-Cron код (пример выше) | Полный контроль, легковесность, гибкость | Нужно писать и тестировать, требует cron |