Что такое отложенный платеж в WooCommerce и зачем он нужен
Отложенный платеж — это возможность принять заказ от клиента и разрешить оплату в более поздний срок, например, после проверки товара или согласования условий. WooCommerce по умолчанию не предлагает встроенного решения для такой функциональности, но её можно реализовать с помощью пользовательского кода и настроек.
Диагностика: как понять, что нужен отложенный платеж
Если вы заметили, что многие клиенты оформляют заказы, но не оплачивают их сразу, или хотите управлять оплатой на стороне менеджера, отложенный платеж поможет увеличить конверсию и упростить обработку заказов.
Проверьте следующие признаки:
- Заказы со статусом «Ожидает оплаты» висят в системе длительное время.
- Клиенты просят выставить счёт позже или согласовывают оплату отдельно.
- Текущие методы оплаты не позволяют гибко управлять временем списания средств.
Пошаговое решение: как добавить отложенный платеж через код
1. Создаём новый статус заказа «Отложенный платеж»
Добавим кастомный статус для удобства управления заказами с отложенной оплатой. В functions.php вашей темы или в плагине используйте следующий код:
add_action('init', 'register_pending_payment_order_status');
function register_pending_payment_order_status() {
register_post_status('wc-pending-payment', array(
'label' => 'Отложенный платеж',
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Отложенный платеж <span class="count">(%s)</span>', 'Отложенный платеж <span class="count">(%s)</span>')
));
}
add_filter('wc_order_statuses', 'add_pending_payment_to_order_statuses');
function add_pending_payment_to_order_statuses($order_statuses) {
$new_order_statuses = array();
foreach ($order_statuses as $key => $status) {
$new_order_statuses[$key] = $status;
if ('wc-pending' === $key) {
$new_order_statuses['wc-pending-payment'] = 'Отложенный платеж';
}
}
return $new_order_statuses;
}2. Добавляем метод оплаты «Отложенный платеж»
Создайте кастомный метод оплаты, который не будет списывать деньги сразу, а оставит заказ с новым статусом:
add_action('plugins_loaded', 'init_offline_pending_payment_gateway');
function init_offline_pending_payment_gateway() {
if (!class_exists('WC_Payment_Gateway')) return;
class WC_Gateway_Pending_Payment extends WC_Payment_Gateway {
public function __construct() {
$this->id = 'pending_payment';
$this->method_title = 'Отложенный платеж';
$this->method_description = 'Оплата позже, без списания сразу';
$this->has_fields = false;
$this->init_settings();
$this->title = $this->get_option('title');
$this->description = $this->get_option('description');
$this->enabled = $this->get_option('enabled');
add_action('woocommerce_thankyou_' . $this->id, array($this, 'thankyou_page'));
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' => 'Включить/Выключить',
'type' => 'checkbox',
'label' => 'Включить Отложенный платеж',
'default' => 'yes'
),
'title' => array(
'title' => 'Название',
'type' => 'text',
'description' => 'Название метода оплаты, которое увидят клиенты',
'default' => 'Оплата позже',
'desc_tip' => true,
),
'description' => array(
'title' => 'Описание',
'type' => 'textarea',
'default' => 'Оплата по согласованию после оформления заказа',
),
);
}
public function process_payment($order_id) {
$order = wc_get_order($order_id);
$order->update_status('pending-payment', 'Заказ оформлен с отложенным платежом.');
WC()->cart->empty_cart();
return array(
'result' => 'success',
'redirect' => $this->get_return_url($order),
);
}
public function thankyou_page() {
echo '<p>Спасибо за заказ! Оплата будет произведена позже.</p>';
}
}
add_filter('woocommerce_payment_gateways', function ($methods) {
$methods[] = 'WC_Gateway_Pending_Payment';
return $methods;
});
}3. Отображаем статус в админке и на сайте
После добавления статуса «Отложенный платеж» и метода оплаты, убедитесь, что он отображается в списках заказов и в фильтрах WooCommerce.
Проверка результата после внедрения
- Перейдите на страницу оформления заказа и выберите метод оплаты «Оплата позже».
- Оформите тестовый заказ, убедитесь, что статус изменился на «Отложенный платеж».
- Проверьте, что корзина очистилась и покупатель получил подтверждение.
- В админке WooCommerce в списке заказов отображается новый статус и его можно фильтровать.
Частые ошибки и как их исправить
- Статус заказа не появляется в списках: Проверьте, что функции
register_post_statusи фильтрwc_order_statusesподключены корректно и нет конфликтов с другими плагинами. - Метод оплаты не отображается: Убедитесь, что класс наследует
WC_Payment_Gatewayи что добавлен в массив методов через фильтрwoocommerce_payment_gateways. - Статус не меняется после оформления: Проверьте, что метод
process_paymentвозвращает правильный массив с редиректом и что вызов$order->update_status()происходит без ошибок.
Практические советы по безопасности и производительности
- Не храните чувствительные данные клиента в комментариях к заказу или метаданных без шифрования.
- Минимизируйте количество кастомных статусов, чтобы не усложнять логику и не влиять на производительность.
- Проверяйте совместимость с популярными плагинами кеширования и платежными шлюзами.
Сравнение вариантов реализации отложенного платежа
| Способ | Плюсы | Минусы |
|---|---|---|
| Плагин сторонний (например, WooCommerce Deposits) | Готовое решение с поддержкой, настройки через UI | Платно, может быть избыточным для простых задач |
| Кодовое решение (как в статье) | Полный контроль, бесплатно, кастомизируемо | Требует навыков программирования, поддержка и обновления на вашей стороне |
| Использование стандартного статуса «Ожидает оплаты» | Просто, без вмешательств | Менее информативно, могут путаться с другими неоплаченными заказами |