Что такое отложенная оплата и зачем она нужна в WooCommerce
Отложенная оплата — это возможность для клиентов разместить заказ, но оплатить его позже, например, через банковский перевод или при получении. Это полезно для оптовых клиентов, корпоративных заказов или если нужно дополнительное подтверждение перед проведением платежа.
Стандартный WooCommerce не поддерживает отложенную оплату «из коробки». Чтобы реализовать эту функцию, потребуется добавить новый способ оплаты и управлять статусами заказов.
Диагностика задачи: какие требования и что проверить
- Нужно ли полностью отключать автоматическую оплату или добавить новый метод?
- Как клиент будет уведомлен о необходимости оплаты?
- Какие статусы заказов использовать для отложенной оплаты?
- Как администратору видеть и фильтровать такие заказы?
Перед началом проверьте, какой тип оплаты сейчас используется и есть ли конфликты с другими плагинами оплаты.
Пошаговое решение: добавляем метод отложенной оплаты в WooCommerce
1. Создаем кастомный метод оплаты
Добавьте в файл functions.php вашей темы или создайте плагин с таким кодом:
add_filter('woocommerce_payment_gateways', 'add_deferred_payment_gateway');
function add_deferred_payment_gateway($gateways) {
$gateways[] = 'WC_Gateway_Deferred_Payment';
return $gateways;
}
class WC_Gateway_Deferred_Payment extends WC_Payment_Gateway {
public function __construct() {
$this->id = 'deferred_payment';
$this->method_title = __('Отложенная оплата', 'woocommerce');
$this->has_fields = false;
$this->init_form_fields();
$this->init_settings();
$this->title = $this->get_option('title');
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
}
public function init_form_fields() {
$this->form_fields = array(
'enabled' => array(
'title' => __('Включить/Отключить', 'woocommerce'),
'type' => 'checkbox',
'label' => __('Включить отложенную оплату', 'woocommerce'),
'default' => 'yes'
),
'title' => array(
'title' => __('Название метода оплаты', 'woocommerce'),
'type' => 'text',
'description' => __('Название, которое увидит клиент при оформлении заказа.', 'woocommerce'),
'default' => __('Оплата по счету (отложенная)', 'woocommerce'),
'desc_tip' => true,
),
);
}
public function process_payment($order_id) {
$order = wc_get_order($order_id);
$order->update_status('on-hold', __('Ожидает оплаты', 'woocommerce'));
WC()->cart->empty_cart();
return array(
'result' => 'success',
'redirect' => $this->get_return_url($order)
);
}
}2. Активируем метод оплаты в настройках WooCommerce
Перейдите в WooCommerce → Настройки → Оплата. Найдите «Оплата по счету (отложенная)» и включите её. Можно настроить название и описание, которые увидят покупатели.
3. Уведомления и статус заказов
При выборе этого способа заказ получает статус on-hold. Рекомендуется настроить уведомления для администратора и клиента, чтобы они знали о необходимости оплаты.
Пример добавления пользовательского письма клиенту при статусе on-hold:
add_action('woocommerce_order_status_on-hold_to_processing_notification', 'notify_customer_on_payment');
function notify_customer_on_payment($order) {
$mailer = WC()->mailer();
$mails = $mailer->get_emails();
if (!empty($mails['WC_Email_Customer_On_Hold_Order'])) {
$mails['WC_Email_Customer_On_Hold_Order']->trigger($order->get_id());
}
}Проверка результата после внедрения
- Оформите тестовый заказ, выбрав метод «Оплата по счету (отложенная)».
- После оформления проверьте, что статус заказа
on-hold. - Убедитесь, что корзина очищается.
- Проверьте письмо на e-mail покупателя и администратора.
- В админке в списке заказов фильтруйте по статусу «Ожидает оплаты» и убедитесь, что заказ отображается.
Частые ошибки и как их исправить
- Метод оплаты не отображается на странице оформления заказа
Проверьте, что фильтрwoocommerce_payment_gatewaysподключен корректно и класс метода оплаты указан верно. - Заказ не меняет статус на on-hold
Убедитесь, что в методеprocess_paymentвызываетсяupdate_status('on-hold')и что нет конфликтов с другими плагинами. - Клиент не получает уведомление
Проверьте настройки почты WordPress и наличие обработчиков писем для статусаon-hold. - Корзина не очищается после оформления
ВызовитеWC()->cart->empty_cart();после обновления статуса заказа.
Практические советы по безопасности и производительности
- Не храните чувствительные данные в сессии или куках — все данные заказа должны быть в базе WooCommerce.
- Проверяйте права доступа при изменении статусов заказов программно.
- Для уведомлений используйте стандартный механизм WooCommerce e-mail, чтобы не создавать лишнюю нагрузку и обеспечить совместимость.
- Чтобы избежать конфликтов, тестируйте метод оплаты с другими популярными плагинами оплаты и кеширования.
Сравнение способов реализации отложенной оплаты в WooCommerce
| Способ | Пример | Плюсы | Минусы |
|---|---|---|---|
| Плагин для отложенной оплаты | WooCommerce Deposits, Partial Payments | Готовое решение, поддержка, настройки через UI | Платно, может конфликтовать с другими плагинами |
| Кастомный метод оплаты (код) | Пример выше | Полный контроль, бесплатно, гибко | Требует навыков PHP, поддержка на разработчике |
| Использование стандартных методов оплаты с инструкциями | Оплата по счету, Банковский перевод | Просто, без кода | Меньше контроля, нет автоматизации |