Почему важно автоматически менять статус заказа после оплаты в WooCommerce
В стандартной конфигурации WooCommerce статусы заказов меняются вручную или автоматически в зависимости от способа оплаты. Однако в некоторых случаях требуется кастомное поведение — например, сразу переводить заказ в статус "выполнен" после успешной оплаты, чтобы ускорить обработку или интегрировать с внешними системами.
Диагностика проблемы: заказ не меняет статус после оплаты
Если заказ остаётся в статусе "обработка" или "ожидает оплаты" после успешной транзакции, это может вызвать задержки в обработке и недовольство клиентов. Основные причины:
- Платёжный шлюз не отправляет вебхуки или не обновляет статус автоматически.
- Конфликт плагинов, блокирующих изменение статуса.
- Отсутствие кастомной логики для нестандартных способов оплаты.
Пошаговое решение: автоматическое изменение статуса заказа после оплаты через PHP
Для решения задачи воспользуемся хуком woocommerce_payment_complete. Он срабатывает, когда WooCommerce считает оплату завершённой.
<?php
// В functions.php вашей темы или в кастомном плагине
add_action('woocommerce_payment_complete', 'custom_set_order_status_completed');
function custom_set_order_status_completed($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем текущий статус, чтобы не затирать важные статусы
if ($order->get_status() !== 'completed') {
$order->update_status('completed', 'Статус заказа автоматически изменён после оплаты.');
}
}
Если нужно изменить статус только для определённых способов оплаты, добавьте проверку:
add_action('woocommerce_payment_complete', 'custom_set_order_status_completed_for_gateway');
function custom_set_order_status_completed_for_gateway($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$payment_method = $order->get_payment_method();
// Например, только для оплаты через 'bacs' (банковский перевод)
if ($payment_method === 'bacs' && $order->get_status() !== 'completed') {
$order->update_status('completed', 'Автоматическое завершение заказа для BACS.');
}
}
Проверка результата после внедрения
- Сделайте тестовый заказ с выбранным способом оплаты, для которого прописана автоматизация.
- Оплатите заказ (или воспользуйтесь тестовым режимом платежного шлюза).
- Перейдите в админку WooCommerce → Заказы и проверьте, изменился ли статус заказа на "Выполнен".
- В комментариях к заказу должна появиться запись с вашим сообщением об изменении статуса.
Частые ошибки и как их исправить
- Статус не меняется: Убедитесь, что хук
woocommerce_payment_completeсрабатывает. Для этого можно временно добавитьerror_log('payment_complete fired: ' . $order_id);внутри функции. - Неправильный ID заказа: Проверяйте, что аргумент
$order_idвалиден и объект$orderуспешно получен. - Конфликты с другими плагинами: Отключите сторонние плагины и проверьте, не блокируют ли они изменение статуса.
- Неверный способ оплаты: Проверьте правильность идентификатора способа оплаты через
$order->get_payment_method().
Практические советы по безопасности и производительности
- Не используйте этот код для автоматического завершения заказов при способах оплаты, требующих подтверждения (например, банковский перевод) — это может привести к ошибкам и финансовым потерям.
- Добавляйте логирование в рабочем режиме только при необходимости, чтобы не нагружать сервер.
- Размещайте кастомный код в дочерней теме или отдельном плагине, чтобы избежать потери изменений при обновлении.
- Тестируйте все изменения на staging-среде, чтобы не нарушить процесс продаж на живом сайте.
Сравнение вариантов реализации автоматического изменения статуса заказа
| Вариант | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
Использование хука woocommerce_payment_complete | Простая и надёжная реализация через стандартный хук WooCommerce | Не подходит для всех способов оплаты, где требуется ручная проверка | Добавить фильтрацию по способу оплаты |
| Обработка через вебхуки платёжного шлюза | Точная синхронизация со статусом платежа | Сложнее в настройке, зависит от сторонних сервисов | Использовать вместе с хуком WooCommerce для резервного варианта |
| Плагины автоматизации заказов | Готовые решения без кода | Могут быть платными, избыточными по функционалу | Использовать при отсутствии возможности писать код |