Диагностика проблемы: почему создаются заказы автоматически
В стандартной работе WooCommerce заказ создаётся автоматически, когда клиент завершает оплату. Это поведение удобно, но иногда возникает необходимость отключить автоматическое создание заказов, например, если вы используете сторонние системы оплаты с подтверждением вручную или интегрируете кастомные процессы обработки заказов.
Основные причины, по которым нужно отключить автоматическое создание заказов:
- Нужна ручная проверка платежа перед созданием заказа.
- Используется нестандартный способ оплаты, не поддерживаемый WooCommerce по умолчанию.
- Необходимо избежать дублирования заказов при повторных запросах от платёжной системы.
Что происходит в WooCommerce при оплате
По умолчанию WooCommerce создаёт заказ в момент начала оформления, а статус обновляется после подтверждения платежа. Однако некоторые плагины или методы оплаты могут создавать дополнительные заказы или изменять логику.
Ключевые хуки и функции
woocommerce_checkout_create_order— фильтр для изменения или отмены создания заказа.woocommerce_payment_complete— действие, вызываемое после успешной оплаты.wc_create_order()— функция создания заказа программно.
Пошаговое решение: отключение автоматического создания заказов
Чтобы отключить автоматическое создание заказов, можно перехватить процесс создания заказа и отменить его, а затем создавать заказ вручную по вашему сценарию.
Пример кода для отмены автоматического создания заказа на этапе оформления:
add_filter('woocommerce_checkout_create_order', function($order, $data) {
// Отменяем создание заказа, возвращая null
return null;
}, 10, 2);Однако этот подход может привести к ошибкам, так как WooCommerce ожидает объект заказа. Вместо этого лучше переопределить обработчик оплаты или использовать кастомный шлюз.
Лучшее решение — использовать кастомный платежный шлюз, где вы контролируете создание заказа самостоятельно. Пример упрощённого кода кастомного шлюза с отключением авто-создания заказа:
class WC_Gateway_Custom extends WC_Payment_Gateway {
public function process_payment($order_id) {
// Не создаём заказ автоматически
// Вместо этого сохраняем данные и ожидаем ручного подтверждения
$order = wc_get_order($order_id);
// Установить статус в ожидании оплаты
$order->update_status('on-hold', 'Ожидание ручного подтверждения платежа');
return [
'result' => 'success',
'redirect' => $this->get_return_url($order),
];
}
}Как проверить, что решение сработало
- Оформите заказ с использованием кастомного шлюза.
- Проверьте в админке WooCommerce, что заказ создаётся с нужным статусом и не создаются дубли.
- Просмотрите логи в WooCommerce (если включены) для подтверждения, что нет лишних вызовов создания заказа.
- Используйте дебаггер PHP или Xdebug для отслеживания вызова
wc_create_order().
Частые ошибки и их исправление
- Ошибка: Появляются дубли заказов.
Причина: Платёжный шлюз или плагин создаёт заказ вне стандартного потока.
Решение: Отследить и отключить вызовыwc_create_order()в сторонних плагинах или заменить их кастомным шлюзом. - Ошибка: Ошибка при оформлении заказа, если возвращать
nullв фильтреwoocommerce_checkout_create_order.
Причина: WooCommerce ожидает объект заказа.
Решение: Не отменять создание заказа этим фильтром, а использовать кастомные методы контроля. - Ошибка: Статус заказа не обновляется после оплаты.
Причина: Не вызвано действиеwoocommerce_payment_complete.
Решение: В кастомном шлюзе явно вызывайте$order->payment_complete();после подтверждения оплаты.
Практические советы по безопасности и производительности
- При ручном создании или обновлении заказов контролируйте права доступа и проверяйте данные, чтобы избежать создания некорректных заказов.
- Включайте логи WooCommerce для отслеживания работы платежных процессов, особенно на продакшене.
- Используйте транзакции базы данных, если создаёте заказ программно с дополнительными мета-данными.
- Если интегрируете сторонние API, следите за таймаутами и обработкой ошибок, чтобы не блокировать сайт.
Сравнение вариантов отключения автоматического создания заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_checkout_create_order | Попытка отменить создание заказа через фильтр | Простота реализации | Приводит к ошибкам, не рекомендуется |
| Кастомный платежный шлюз | Создаёт заказ вручную по логике обработки платежа | Полный контроль, безопасно | Требует разработки |
| Отключение стандартных шлюзов | Использование только кастомных решений | Минимум конфликтов | Может ограничить способы оплаты |