Диагностика проблемы с неоплаченными заказами
В WooCommerce часто возникает ситуация, когда заказы остаются в статусе processing или on-hold, хотя оплата не прошла или была отменена. Это приводит к накоплению «зависших» заказов, которые засоряют базу и мешают точному учету продаж.
Чтобы проверить, есть ли такие заказы, выполните следующий SQL-запрос в базе данных WordPress:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-processing', 'wc-on-hold') AND ID NOT IN (
SELECT order_id FROM wp_woocommerce_order_items
WHERE order_item_type = 'line_item'
);
Этот запрос покажет заказы в статусах processing и on-hold, у которых нет оплаченных товаров (то есть, вероятно, оплата не прошла).
Пошаговое решение: автоматическая отмена неоплаченных заказов
1. Добавление планировщика задач (WP-Cron)
Чтобы регулярно проверять неоплаченные заказы и отменять их, используйте WP-Cron. В файле functions.php вашей темы или в плагине добавьте следующий код для регистрации события:
add_action('wp', function() {
if (!wp_next_scheduled('auto_cancel_unpaid_orders_event')) {
wp_schedule_event(time(), 'hourly', 'auto_cancel_unpaid_orders_event');
}
});
2. Реализация функции отмены заказов
Создаем функцию, которая будет искать неоплаченные заказы старше 1 часа и менять их статус на cancelled:
add_action('auto_cancel_unpaid_orders_event', function() {
$args = [
'limit' => -1,
'status' => ['wc-on-hold', 'wc-processing'],
'date_modified' => '<' . (time() - 3600), // заказ старше 1 часа
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$payment_method = $order->get_payment_method();
$paid = $order->is_paid();
// Отменяем только если заказ не оплачен
if (!$paid) {
$order->update_status('cancelled', 'Автоматическая отмена из-за отсутствия оплаты.');
}
}
});
Проверка результата после внедрения
- Создайте тестовый заказ с оплатой, которую не завершаете (например, выберите метод оплаты «наложенный платеж» или отключите оплату в песочнице).
- Подождите больше часа, затем в админке WooCommerce откройте список заказов и проверьте статус тестового заказа — он должен измениться на
Отменён. - Можно принудительно запустить крон-событие через WP-CLI для ускорения проверки:
wp cron event run --due-now
Частые ошибки и способы их устранения
- Событие WP-Cron не срабатывает: Причина — отсутствие реального трафика на сайт или отключенный WP-Cron. Решение — настроить системный cron на сервере для вызова
wp-cron.php. - Заказы не отменяются, хотя неоплачены: проверьте правильность условий фильтрации в
wc_get_orders(например, статус и дата). - Отмена заказов происходит слишком рано: измените временной промежуток в условии
date_modifiedна более длительный (например, 2 часа или 24 часа). - Отмена затрагивает оплаченные заказы: убедитесь, что проверка оплаты
$order->is_paid()корректна, и не стоит ли в WooCommerce сторонних плагинов, влияющих на статус оплаты.
Практические советы по безопасности и производительности
- Добавляйте логирование действий функции отмены для анализа — можно записывать в отдельный файл или использовать стандартный лог WordPress.
- Ограничьте количество обрабатываемых заказов за одно выполнение, чтобы избежать превышения лимитов памяти и времени исполнения.
- Для крупных магазинов рекомендуется запускать задачу чаще, но с меньшим объемом обрабатываемых заказов.
- Проверьте, что функция не конфликтует с плагинами платежных систем, особенно если они используют собственные статусы заказов.
Сравнение способов реализации автоматической отмены заказов
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Использование WP-Cron с пользовательской функцией | Регулярный запуск PHP-скрипта в WordPress | Гибкость, простой контроль логики | Зависит от трафика, возможна задержка |
| Плагин автоконтроля заказов | Готовые решения с настройками | Удобство, простота внедрения | Может быть избыточным, нагрузка на сайт |
| Серверный cron и WP-CLI | Запуск команд из системного планировщика | Быстрота, надежность | Требует доступа к серверу и навыков администрирования |