wpcontrol.ru wordpress WPControl.ru

WooCommerce: как отключить автоматическое создание заказов при оплате

Диагностика проблемы: почему создаются заказы автоматически

В стандартной работе 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Попытка отменить создание заказа через фильтрПростота реализацииПриводит к ошибкам, не рекомендуется
Кастомный платежный шлюзСоздаёт заказ вручную по логике обработки платежаПолный контроль, безопасноТребует разработки
Отключение стандартных шлюзовИспользование только кастомных решенийМинимум конфликтовМожет ограничить способы оплаты
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙