Диагностика проблемы: почему заказы остаются неподтверждёнными и оплачены ли они?
В WooCommerce часто встречается ситуация, когда покупатель создаёт заказ, но не завершает оплату. Такие «зависшие» заказы занимают ресурсы базы данных и могут влиять на отчётность и складской учёт. По умолчанию WooCommerce удаляет такие заказы только через 60 дней, что зачастую слишком долго.
Для диагностики нужно проверить следующие моменты:
- Статус заказа:
pendingилиon-hold— значит заказ создан, но оплата не подтверждена. - Дата создания заказа — чтобы определить, сколько времени он висит без оплаты.
- Оплаченный ли заказ — статус оплаты в WooCommerce обычно меняется на
processingилиcompletedпосле успешной оплаты.
Как проверить статус неподтверждённых заказов в базе данных
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND (post_status = 'wc-pending' OR post_status = 'wc-on-hold') ORDER BY post_date ASC;Этот запрос покажет список заказов, которые в ожидании оплаты.
Пошаговое решение: отключение оплаты и отмена неподтверждённых заказов с помощью WP-Cron
Задача — автоматически менять статус неподтверждённых заказов после определённого времени (например, 1 час), чтобы заблокировать оплату и уведомить администратора.
1. Создаём функцию для обработки неподтверждённых заказов
function wc_auto_cancel_unpaid_orders() {
$time_limit = strtotime('-1 hour');
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'date_created' => '<' . date('Y-m-d H:i:s', $time_limit),
);
$orders = wc_get_orders($args);
foreach ($orders as $order) {
// Меняем статус на отменённый
$order->update_status('cancelled', 'Заказ автоматически отменён из-за неоплаты более 1 часа.');
// Можно добавить уведомление админу
wp_mail(get_option('admin_email'), 'Отменён неподтверждённый заказ #' . $order->get_id(), 'Заказ отменён автоматически системой из-за отсутствия оплаты.');
}
}2. Регистрируем WP-Cron задачу
add_action('wc_auto_cancel_unpaid_orders_hook', 'wc_auto_cancel_unpaid_orders');
if (!wp_next_scheduled('wc_auto_cancel_unpaid_orders_hook')) {
wp_schedule_event(time(), 'hourly', 'wc_auto_cancel_unpaid_orders_hook');
}3. Код для отмены задачи при деактивации плагина или темы
function wc_auto_cancel_unpaid_orders_deactivation() {
$timestamp = wp_next_scheduled('wc_auto_cancel_unpaid_orders_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_auto_cancel_unpaid_orders_hook');
}
}
register_deactivation_hook(__FILE__, 'wc_auto_cancel_unpaid_orders_deactivation');Проверка результата после внедрения
- Через час после создания новых заказов со статусом
pendingилиon-holdпроверить, что они автоматически меняются наcancelled. - Проверить почту администратора на получение уведомлений об отменённых заказах.
- В админке WooCommerce в разделе Заказы убедиться, что неподтверждённые заказы исчезают из списка активных.
Частые ошибки и как их исправить
- WP-Cron не запускается: На локальном сервере или при низкой посещаемости сайта WP-Cron может не срабатывать. Рекомендуется настроить системный cron на сервере или вызвать событие вручную.
- Неправильный статус заказа: Если заказ уже оплачен или находится в статусе, отличном от
pendingиon-hold, он не будет обработан. Проверьте правильность указания статусов в фильтре. - Письма не отправляются: Проверьте настройки SMTP на сайте, используйте плагины типа WP Mail SMTP для отладки.
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами заказов оптимизируйте выборку заказов, добавляя пагинацию, чтобы не перегрузить память.
- Используйте nonce и проверку прав, если планируете расширять функционал с взаимодействием пользователя.
- Для уведомлений используйте очереди или интеграцию с внешними сервисами (например, SMTP с очередями), чтобы избежать блокировки при массовой рассылке.
Сравнение вариантов реализации автоматической отмены заказов
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| WP-Cron PHP скрипт (как в статье) | Гибко, без плагинов, полный контроль | Зависит от посещаемости сайта, настройка системы нужна для надёжности | Средние и крупные магазины с техническими навыками |
| Плагины управления заказами (например, WooCommerce Order Status Manager) | Простота настройки, интерфейс | Могут быть платными, ограниченный контроль | Малые магазины без разработчиков |
| Внешние сервисы (через API WooCommerce) | Отдельный контроль, масштабируемость | Сложность интеграции, затраты на сервис | Крупные проекты, интеграции с CRM |