Как отключить оплату при нулевом заказе в WooCommerce и оставить бесплатный способ доставки

Сценарий типичный: в корзине после купона, скидки или бесплатной доставки итоговая сумма становится 0, но WooCommerce всё равно показывает платёжные шлюзы. В результате клиент видит лишний шаг, а иногда ещё и ошибку от платёжного модуля, который не умеет работать с нулевыми заказами.

Задача здесь не в том, чтобы «выключить оплату вообще», а в том, чтобы убрать её только для заказов без суммы и не сломать оформление, доставку и письма.

Как понять, что проблема именно в нулевом заказе

Сначала проверьте, где именно появляется лишняя оплата. В WooCommerce это обычно видно в одном из трёх мест:

  • на странице оформления заказа после применения купона;
  • в корзине, если итог пересчитался до нуля;
  • в админке у заказа, где сумма заказа равна 0, но статус всё равно требует оплаты.

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

Что проверить перед изменениями

  • есть ли у вас бесплатная доставка как отдельный метод;
  • используются ли купоны, которые могут обнулять заказ;
  • не завязаны ли платёжные модули на обязательный выбор способа оплаты;
  • есть ли кастомные плагины, которые меняют расчёт итогов.

Какие есть варианты решения

На практике есть три пути: настройка платёжного шлюза, код в теме или мини-плагин. Если у вас один-двa шлюза и они поддерживают нулевые заказы, можно обойтись настройкой. Но в большинстве случаев надёжнее убрать методы оплаты программно только для суммы 0.

ПодходКогда подходитМинус
Настройка в шлюзеЕсли модуль умеет работать с бесплатными заказамиНе все плагины это поддерживают
Код через фильтр WooCommerceЕсли нужно точечно скрывать оплату при нулевой суммеНужно аккуратно тестировать
Отдельный плагин-обвязкаЕсли не хочется править темуЛишняя сущность в проекте

Пошаговое решение через фильтр доступных способов оплаты

Самый практичный вариант — отфильтровать методы оплаты на фронтенде. WooCommerce для этого даёт фильтр woocommerce_available_payment_gateways. Мы проверяем итоговую сумму корзины и, если она равна нулю, убираем все платёжные шлюзы.

<?php
add_filter( 'woocommerce_available_payment_gateways', 'wpbuy_hide_gateways_for_free_order' );

function wpbuy_hide_gateways_for_free_order( $gateways ) {
    if ( is_admin() ) {
        return $gateways;
    }

    if ( ! function_exists( 'WC' ) || ! WC()->cart ) {
        return $gateways;
    }

    $total = (float) WC()->cart->get_total( 'edit' );

    // Убираем оплату только для нулевого заказа.
    if ( $total <= 0 ) {
        return array();
    }

    return $gateways;
}

Этот вариант работает просто: если сумма заказа нулевая, клиент не увидит ни cod, ни банковскую карту, ни другие шлюзы. Оформление при этом не ломается, если у вас корректно настроены доставка и статус заказа.

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

Иногда удобнее оставить, например, оплату при доставке, но скрыть онлайн-эквайринг. Тогда фильтруйте конкретные ключи шлюзов:

<?php
add_filter( 'woocommerce_available_payment_gateways', 'wpbuy_hide_online_gateways_for_free_order' );

function wpbuy_hide_online_gateways_for_free_order( $gateways ) {
    if ( is_admin() || ! function_exists( 'WC' ) || ! WC()->cart ) {
        return $gateways;
    }

    $total = (float) WC()->cart->get_total( 'edit' );

    if ( $total <= 0 ) {
        unset( $gateways['stripe'] );
        unset( $gateways['paypal'] );
        unset( $gateways['yookassa'] );
    }

    return $gateways;
}

Ключи stripe, paypal, yookassa — это примеры. У вас они могут отличаться, поэтому сначала посмотрите идентификатор шлюза в коде плагина или через отладку массива $gateways.

Как не сломать бесплатную доставку и оформление заказа

Частая ошибка — убрать все способы оплаты и забыть, что WooCommerce всё равно ждёт корректный сценарий завершения заказа. Если заказ становится бесплатным, клиент должен иметь возможность оформить его без выбора платёжного метода. Обычно это работает штатно, если:

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

Если у вас бесплатный заказ создаётся, но потом висит в статусе pending payment, проверьте логику платёжного шлюза. Некоторые модули не умеют корректно завершать заказ без транзакции. В таком случае лучше не отключать шлюз целиком, а перевести заказ в нужный статус отдельным хуком уже после создания заказа.

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

После добавления кода проверьте решение не на одном сценарии, а минимум на трёх:

  1. заказ без купона, с обычной суммой;
  2. заказ с купоном, который обнуляет итог;
  3. заказ с бесплатной доставкой и скидкой одновременно.

Что должно получиться:

  • при сумме больше нуля платёжные методы видны;
  • при сумме 0 способы оплаты скрыты;
  • заказ создаётся без ошибок;
  • в админке заказ не зависает в неправильном статусе;
  • письмо клиенту уходит в ожидаемом виде.

Если есть доступ к журналам WooCommerce, откройте WooCommerce > Статус > Журналы и проверьте, не появились ли ошибки от платёжных модулей после тестового оформления.

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

Используют не тот источник суммы

Иногда берут WC()->cart->total или строку из get_total() без приведения к числу. Из-за форматирования и валюты сравнение может работать нестабильно. Для проверки лучше приводить значение к float и сравнивать с 0.

Скрывают оплату в админке

Если не добавить проверку is_admin(), фильтр может мешать работе в панели управления или в AJAX-запросах WooCommerce. Это особенно заметно при редактировании заказов вручную.

Не учитывают сторонние плагины доставки и скидок

Плагины, которые меняют итог заказа на лету, могут пересчитывать корзину после вашего фильтра. Если поведение нестабильное, проверьте порядок загрузки кода и отключите конфликтующие расширения по одному.

Ожидают, что любой шлюз поддерживает нулевой заказ

Это не так. Некоторые платёжные плагины рассчитаны только на реальные транзакции. Если модуль падает на бесплатном заказе, его лучше скрывать через фильтр, а не пытаться «дожать» настройками.

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

Не вносите такой код прямо в functions.php активной темы, если проект живой и тема может обновляться. Надёжнее использовать небольшой mu-plugin или отдельный мини-плагин. Так решение не исчезнет после обновления темы.

Если вы редактируете код вручную, сначала проверьте его на staging-окружении. Для магазинов это особенно важно: один неверный фильтр может скрыть оплату не только для бесплатных, но и для обычных заказов.

Когда нужно не просто скрыть лишние элементы, а ещё и почистить интерфейс оформления заказа, полезно посмотреть в сторону Clearfy Pro. Но для самой логики нулевого заказа всё равно нужен точечный код или настройка шлюза.

Если нужен более жёсткий контроль сценария

Иногда бизнес-логика требует не просто скрыть оплату, а автоматически переводить бесплатный заказ в отдельный статус или отправлять его в ручную проверку. Это уже отдельная задача: здесь важно не смешивать её с отключением платёжных методов. Сначала убедитесь, что клиент может оформить заказ без оплаты, а потом добавляйте постобработку заказа через хуки WooCommerce.

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

Автозаполнение форм в WordPress с помощью JavaScript и AJAX
03.10.2026
Как создать плагин для WordPress с нуля: подробное руководство с примером кода
13.09.2026
Как отключить открытые REST API-запросы в WordPress для неавторизованных пользователей
14.09.2026
Как отключить открытые XML-RPC запросы в WordPress и проверить, что сайт не ломается
06.09.2026
Как добавить уникальные метаполя для продукта WooCommerce с примером кода
25.09.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »