Диагностика задачи: когда нужно отменить заказ после оплаты
В WooCommerce бывают ситуации, когда нужно автоматически отменять заказ после успешной оплаты. Например, если товар отсутствует на складе, или заказ требует дополнительной проверки, и нельзя позволить ему перейти в статус "завершён" или "в обработке". По умолчанию WooCommerce не предоставляет такой функционал, поэтому приходится реализовывать его самостоятельно через код.
Пошаговое решение: отменяем заказ после оплаты
1. Выбор правильного хука для отслеживания оплаты
Для реагирования на успешную оплату лучше всего использовать хук woocommerce_order_status_completed или woocommerce_payment_complete. Первый срабатывает, когда заказ переводится в статус "завершён", второй — сразу после успешной оплаты.
В зависимости от бизнес-логики, стоит выбрать подходящий.
2. Добавляем функцию отмены заказа
Ниже пример функции, которая отменяет заказ сразу после оплаты. В реальном сценарии здесь можно добавить условия (например, проверка наличия товара или определённый метод оплаты).
add_action('woocommerce_payment_complete', 'wp7_cancel_order_after_payment');
function wp7_cancel_order_after_payment($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Условие отмены — пример: отменяем все заказы, оплатившиеся через метод 'bacs'
if ($order->get_payment_method() === 'bacs') {
// Проверяем, что заказ не отменён уже
if ($order->get_status() !== 'cancelled') {
$order->update_status('cancelled', __('Заказ автоматически отменён после оплаты (метод BACS)', 'wp7'));
}
}
}3. Подключение к functions.php или в виде мини-плагина
Рекомендуется добавлять код через дочернюю тему или собственный плагин, чтобы не потерять изменения при обновлении.
Проверка результата после внедрения
- Создайте тестовый заказ с оплатой выбранным методом (например, BACS).
- Завершите оплату (можно имитировать для теста).
- Перейдите в админку WooCommerce > Заказы и проверьте статус заказа.
- Он должен автоматически изменить статус на
cancelledи в комментариях к заказу появится сообщение об отмене.
Частые ошибки и как их исправить
- Код не срабатывает: Проверьте, правильно ли указан хук и вызывается ли функция. Добавьте
error_logвнутри функции для отладки. - Отмена происходит не для всех заказов: Проверьте условие в коде. Возможно, метод оплаты отличается или статус заказа уже "cancelled".
- Изменение статуса вызывает бесконечный цикл: Не используйте хук, который срабатывает на смену статуса
cancelled. В примере используетсяwoocommerce_payment_complete— безопасно.
Практические советы по безопасности и производительности
- Не добавляйте в функцию тяжелые операции или внешние запросы — это может замедлить процесс оплаты.
- Для отладки используйте журнал WooCommerce (WooCommerce > Статус > Логи) или системный
error_log. - Обязательно проверяйте, что объект заказа валиден, чтобы избежать фатальных ошибок.
- В продакшене ограничьте логику условиями, чтобы не отменять заказы без нужды.
Сравнение вариантов реализации отмены заказа после оплаты
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_payment_complete | Отмена сразу после оплаты | Работает во всех платежных системах, сразу после оплаты | Нужно аккуратно проверять условия, чтобы не отменить лишнее |
Хук woocommerce_order_status_completed | Отмена при переходе в статус "завершён" | Позволяет отменять заказы после полного завершения | Не срабатывает при оплате без автоматического перехода в "завершён" |
| Плагин автоматизации | Использование готовых решений для автоотмены | Минимум кода, удобный интерфейс | Может влиять на производительность, лишние зависимости |