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

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

Отложенный платёж — это сценарий, когда покупатель оформляет заказ, но оплата поступает позднее, например, после проверки, согласования или вручную. WooCommerce по умолчанию не предлагает готовых решений для отложенной оплаты без использования сторонних плагинов, что создаёт проблему для магазинов с нестандартными бизнес-процессами. Нужно реализовать возможность создавать заказы с «отложенным» статусом и затем принимать платеж отдельно.

Как реализовать отложенный платёж через кастомный статус заказа

1. Добавляем новый статус заказа

Для начала регистрируем статус on-hold-custom — это будет наш отложенный статус:

add_action('init', 'register_custom_order_status');
function register_custom_order_status() {
    register_post_status('wc-on-hold-custom', 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_custom_order_status_to_list');
function add_custom_order_status_to_list($order_statuses) {
    $new_statuses = array();
    foreach ($order_statuses as $key => $status) {
        $new_statuses[$key] = $status;
        if ('wc-on-hold' === $key) {
            $new_statuses['wc-on-hold-custom'] = 'Отложенный платёж';
        }
    }
    return $new_statuses;
}

2. Устанавливаем заказ в новый статус при оформлении

Чтобы заказ при создании сразу попадал в отложенный статус, используем хук woocommerce_thankyou или woocommerce_checkout_order_processed:

add_action('woocommerce_checkout_order_processed', 'set_order_to_on_hold_custom', 10, 1);
function set_order_to_on_hold_custom($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    // Можно добавить условие, кому устанавливать отложенный платёж
    $order->update_status('on-hold-custom', 'Заказ переведен в отложенный платёж');
}

3. Обработка оплаты и смена статуса

После того, как платёж подтверждён (например, вручную или через админку), нужно сменить статус заказа на processing или completed. В админке это делается вручную, но можно реализовать кнопку или крон-задачу для массового изменения.

Проверка результата

  • Создайте заказ на сайте и убедитесь, что его статус после оформления — Отложенный платёж.
  • В админке WooCommerce на странице заказов статус должен отображаться с новой меткой.
  • После оплаты вручную измените статус на processing и проверьте, что клиент получает уведомление (если включены стандартные уведомления WooCommerce).

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

  • Статус не отображается в списке заказов: Проверьте, что функции register_post_status и фильтр wc_order_statuses корректно добавляют статус и что код подключён в functions.php или плагине.
  • Заказ не меняет статус при оформлении: Убедитесь, что хук woocommerce_checkout_order_processed срабатывает и что функция получает ID заказа.
  • Уведомления не уходят: Для кастомных статусов уведомления WooCommerce не настроены по умолчанию. Нужно вручную подключать их через хуки woocommerce_order_status_on-hold-custom_to_processing_notification и др.

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

  • Не меняйте статус заказа без проверки прав пользователя, если реализуете смену через фронтенд или AJAX.
  • Для массовых операций со статусами используйте WP-CLI или wp cron, чтобы не нагружать сервер во время пиков посещаемости.
  • Создайте резервную копию базы перед внедрением кастомных статусов, чтобы избежать потери данных.

Резюме: чек-лист для внедрения отложенного платежа

  1. Добавить кастомный статус заказа через register_post_status и wc_order_statuses.
  2. Установить статус в отложенный при создании заказа через woocommerce_checkout_order_processed.
  3. Обеспечить смену статуса после оплаты вручную или автоматически.
  4. Настроить уведомления для новых статусов (при необходимости).
  5. Проверить в админке и на фронтенде корректность отображения статусов.
  6. Обеспечить безопасность смены статусов (проверка прав).

Сравнение вариантов реализации отложенного платежа

ВариантПлюсыМинусы
Кастомный статус + кодЛёгкая кастомизация, нет зависимости от плагинов, полный контрольТребует базовых знаний PHP, нужно настраивать уведомления вручную
Готовый плагин (например, WooCommerce Deposits)Быстрое решение, готовый функционал, поддержка платежных шлюзовДополнительная нагрузка, часто платные, зависит от стороннего кода
Использование купонов и правил скидок для "отложенного платежа"Простая реализация без кода, подходит для частных случаевНе универсально, не учитывает реальные статусы оплаты
Как добавить поддержку WebP в WordPress без плагинов
10.04.2026
Как отладить проблемы с кэшированием в WordPress
07.11.2025
Как создать собственный виджет в WordPress
17.11.2025
WooCommerce: изменение цены товара в корзине через хук woocommerce_before_calculate_totals
17.06.2026
Как создать собственный REST API эндпоинт в WordPress с фильтрами и параметрами
24.12.2025