Диагностика проблемы с заказами и отменой платежей в WooCommerce
В стандартной установке WooCommerce заказы со статусом "Отменён" или "Отложен" остаются в базе и требуют ручного управления. Если платеж отменяется (например, клиент отказался или произошёл сбой в платёжном шлюзе), заказ не всегда автоматически обновляется, что может привести к путанице в учёте и блокировке инвентаря.
Основные симптомы проблемы:
- Заказы с отменёнными платежами остаются активными и доступны для обработки.
- Инвентарь товаров не освобождается автоматически.
- Ручное управление статусами заказов занимает много времени.
Как проверить проблему
Создайте тестовый заказ и отмените оплату через платёжный шлюз (например, через PayPal sandbox). Если статус заказа не меняется на "Отменён" или не переводится в нужный статус автоматически, проблема актуальна.
Пошаговое решение: автоматическое отключение заказов при отмене платежа
Для автоматизации процесса можно использовать хук woocommerce_order_status_changed и проверить, был ли отменён платёж. Далее меняем статус заказа программно.
add_action('woocommerce_order_status_changed', 'auto_cancel_order_on_payment_cancel', 10, 4);
function auto_cancel_order_on_payment_cancel($order_id, $old_status, $new_status, $order) {
// Пример для отмены платежей, когда статус меняется на failed
if ($new_status === 'failed') {
// Проверяем, что заказ ещё не отменён
if ($order->get_status() !== 'cancelled') {
$order->update_status('cancelled', 'Заказ автоматически отменён из-за отмены платежа.');
}
}
}
Если ваш платёжный шлюз использует другие статусы (например, "on-hold" или "pending"), добавьте соответствующие проверки в условие.
Расширенный пример с WP-Cron для периодической проверки статусов заказов
Иногда платёжные статусы обновляются с задержкой, полезно автоматически очищать заказы с неоплаченным статусом старше 24 часов.
function schedule_cancel_unpaid_orders() {
if (!wp_next_scheduled('cancel_unpaid_orders_hook')) {
wp_schedule_event(time(), 'hourly', 'cancel_unpaid_orders_hook');
}
}
add_action('wp', 'schedule_cancel_unpaid_orders');
add_action('cancel_unpaid_orders_hook', 'cancel_old_unpaid_orders');
function cancel_old_unpaid_orders() {
$args = [
'limit' => -1,
'status' => ['pending', 'on-hold'],
'date_created' => '<' . (time() - DAY_IN_SECONDS),
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('cancelled', 'Заказ автоматически отменён из-за отсутствия оплаты более 24 часов.');
}
}
Проверка результата после внедрения
- Создать тестовый заказ с оплатой, затем отменить платёж через платёжный шлюз.
- Убедиться, что статус заказа изменился на "отменён" (
cancelled) автоматически. - Для cron-задачи: создать заказ без оплаты, подождать 1 час и проверить, что заказ отменён.
- Проверить логи WooCommerce или добавить запись в комментарии заказа для отладки.
Частые ошибки и как их исправить
- Код не срабатывает при смене статуса: Возможно, используется другой статус, не
failed. Проверьте, какие статусы выставляет ваш платёжный шлюз. - Заказы не отменяются автоматически по cron: Проверьте, активен ли WP-Cron на вашем сервере и не блокирует ли его хостинг. Можно настроить системный Cron для вызова
wp-cron.php. - Отмена заказа не освобождает инвентарь: Убедитесь, что WooCommerce корректно управляет запасами, и не переопределяйте статус заказа без учёта этого.
- Конфликты с другими плагинами: Проверьте, не вмешиваются ли другие плагины в обработку статусов заказов.
Практические советы по безопасности и производительности
- Не используйте слишком частый запуск WP-Cron для массовых операций — оптимально раз в час или реже.
- Добавляйте логи и уведомления на случай сбоев автоматизации.
- Тестируйте изменения на стейджинг-сайте перед внедрением в продакшн.
- Для сложных сценариев автоматизации рассмотрите использование специализированных плагинов или кастомных сервисов вебхуков от платёжных шлюзов.
Сравнение вариантов решения задачи
| Метод | Преимущества | Недостатки | Рекомендуемая ситуация |
|---|---|---|---|
Хук woocommerce_order_status_changed | Мгновенное срабатывание, простота кода | Зависимость от правильных статусов от платёжного шлюза | Для простых платежных систем с чёткими статусами |
| WP-Cron периодическая проверка | Обработка задержанных или пропущенных статусов | Задержка в обработке, нагрузка на сервер при большом числе заказов | Для сложных сценариев и задержек в обновлении статусов |
| Плагины автоматизации заказов | Готовые решения с настройками, поддержка | Дополнительные расходы, возможные конфликты | Для пользователей без навыков программирования |