WooCommerce: как реализовать отложенные платежи без плагинов

Что такое отложенные платежи и зачем они нужны в WooCommerce

Отложенные платежи позволяют покупателям оформить заказ, но оплатить его позже — например, после проверки товара или по согласованию. В стандартном WooCommerce такой функционал отсутствует, и все заказы считаются оплаченными сразу или ожидающими оплаты через сторонние платежные системы.

Реализация отложенных платежей напрямую через код поможет гибко настраивать логику оплаты, не устанавливая дополнительные плагины, которые могут утяжелять сайт или конфликтовать с другими расширениями.

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

По умолчанию WooCommerce использует статусы заказов, которые отражают этапы оплаты и обработки:

  • pending — заказ создан, но оплата не начата;
  • processing — оплата подтверждена, идет обработка;
  • on-hold — заказ поставлен на удержание, ожидание оплаты или подтверждения;
  • completed — заказ выполнен;
  • cancelled и failed — отменён или неудачный заказ.

Чтобы реализовать отложенную оплату, нужно управлять статусами и разрешать покупателю оформлять заказ со статусом on-hold без немедленной оплаты, а затем дать возможность оплатить позже.

Пошаговое решение: добавляем поддержку отложенной оплаты через код

1. Добавление метода оплаты "Оплата позже"

Создадим кастомный метод оплаты, который будет переводить заказ в статус on-hold и не требовать оплату сразу.

add_filter('woocommerce_payment_gateways', 'add_later_payment_gateway');
function add_later_payment_gateway($gateways) {
    $gateways[] = 'WC_Gateway_Later_Payment';
    return $gateways;
}

class WC_Gateway_Later_Payment extends WC_Payment_Gateway {
    public function __construct() {
        $this->id = 'later_payment';
        $this->method_title = 'Оплата позже';
        $this->method_description = 'Позволяет оформить заказ и оплатить позже';

        $this->has_fields = false;

        $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 process_payment($order_id) {
        $order = wc_get_order($order_id);
        // Устанавливаем статус заказа "on-hold"
        $order->update_status('on-hold', 'Заказ ожидает оплату позже');
        WC()->cart->empty_cart();

        return array(
            'result' => 'success',
            'redirect' => $this->get_return_url($order)
        );
    }
}

2. Настройка метода оплаты в админке

Перейдите в WooCommerce > Настройки > Платежи и включите метод "Оплата позже". В настройках можно задать название, которое увидит покупатель.

3. Добавление уведомления покупателю с инструкциями по оплате

Чтобы покупатель знал, что нужно оплатить заказ позже, добавим сообщение на страницу подтверждения заказа и в письма.

add_action('woocommerce_thankyou_later_payment', 'custom_later_payment_thankyou_message');
function custom_later_payment_thankyou_message($order_id) {
    echo '<p>Спасибо за заказ! Вы выбрали оплату позже. Пожалуйста, свяжитесь с нами для подтверждения оплаты.</p>';
}

add_action('woocommerce_email_before_order_table', 'custom_later_payment_email_message', 10, 4);
function custom_later_payment_email_message($order, $sent_to_admin, $plain_text, $email) {
    if ($order->get_payment_method() === 'later_payment') {
        echo '<p>Вы выбрали оплату позже. Пожалуйста, оплатите заказ после получения подтверждения.</p>';
    }
}

4. Создание страницы или механизма для последующей оплаты

Для реализации оплаты после оформления заказа можно использовать стандартную систему WooCommerce "Оплатить заказ" по ссылке /checkout/order-pay/{order_id}/, где покупатель сможет выбрать другой способ оплаты и завершить оплату.

Если нужно, можно отправлять эту ссылку клиенту вручную или автоматизировать отправку письма с ней.

Проверка результата после внедрения

  • Перейдите в магазин и оформите заказ, выбрав метод оплаты "Оплата позже".
  • После оформления заказ должен получить статус on-hold.
  • Покупатель должен увидеть сообщение с инструкциями.
  • В админке WooCommerce > Заказы можно проверить статус заказа и отправить ссылку для последующей оплаты.
  • Покупатель может перейти по ссылке /checkout/order-pay/{order_id}/ и оплатить заказ обычным способом.

Частые ошибки и как их исправлять

  • Метод оплаты не отображается на фронте: Проверьте, что класс метода оплаты зарегистрирован и добавлен через фильтр woocommerce_payment_gateways.
  • Заказ не меняет статус на on-hold: Убедитесь, что в методе process_payment вызвана функция $order->update_status('on-hold') до очистки корзины.
  • Письма с инструкциями не отправляются: Проверьте, что хук woocommerce_email_before_order_table корректно добавлен, и метод оплаты совпадает с ID вашего шлюза.
  • Покупатель не может оплатить заказ позже: Проверьте, что ссылка /checkout/order-pay/{order_id}/ доступна и заказ не отменён или не завершён.

Практические советы по безопасности и производительности

  • Не храните платежные данные при отложенной оплате; используйте встроенные методы WooCommerce для повторного проведения оплаты, чтобы избежать утечек данных.
  • Регулярно проверяйте заказы со статусом on-hold и очищайте неактивные, чтобы не захламлять базу.
  • Используйте nonce и проверки прав пользователя при реализации дополнительных функций по оплате, чтобы избежать несанкционированных изменений заказов.
  • Оптимизируйте уведомления, чтобы не дублировать сообщения в письмах и на сайте.

Сравнение вариантов реализации отложенных платежей

СпособПлюсыМинусыРекомендации
Плагин (например, WooCommerce Deposits)Готовое решение с настройками, поддержка частичной оплатыДополнительная нагрузка, может конфликтовать с другими плагинами, платные версииЕсли нужна сложная логика и частичная оплата — использовать
Кастомный метод оплаты (кодом)Минимальная нагрузка, полный контроль, адаптивность под задачиТребует знаний PHP и WooCommerce API, нужно самостоятельно поддерживатьПодходит для простых сценариев и опытных разработчиков
Использование стандартного статуса on-hold без измененийПросто, без кодаНет удобного интерфейса для оплаты позже, пользователь может запутатьсяПодходит для небольших магазинов без требований к UX
Как использовать AJAX в WordPress для обновления контента без перезагрузки
23.12.2025
Как создать автоматический редактор для WordPress с помощью AJAX
15.01.2026
Как удалить и очистить базу данных WordPress от старых мета-данных
08.12.2025
Как автоматизировать управление изображениями в WordPress
27.01.2026
Как создать запросы в WordPress на основе мета данных
22.02.2026