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

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

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

Когда проблема проявляется

Обычно это видно в одном из таких случаев:

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

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

Диагностика: что проверить до правки кода

Прежде чем лезть в шаблоны, проверьте базовые настройки. Это экономит время и помогает понять, где именно возникает конфликт.

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

Если после этого офлайн-оплата всё ещё доступна там, где не нужна, значит, нужно ограничить методы оплаты программно.

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

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

Ниже пример: если выбран самовывоз (local_pickup), метод cod не показывается.

add_filter( 'woocommerce_available_payment_gateways', function( $gateways ) {
    if ( is_admin() ) {
        return $gateways;
    }

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

    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = is_array( $chosen_methods ) ? reset( $chosen_methods ) : '';

    if ( strpos( $chosen_shipping, 'local_pickup' ) !== false ) {
        unset( $gateways['cod'] );
    }

    return $gateways;
} );

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

Если нужно убрать не только COD, но и другие офлайн-методы

Иногда магазин использует несколько офлайн-способов: «Оплата при получении», «Банковский перевод», «Наличные». Тогда проще убрать их списком.

add_filter( 'woocommerce_available_payment_gateways', function( $gateways ) {
    if ( is_admin() || ! function_exists( 'WC' ) || ! WC()->session ) {
        return $gateways;
    }

    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = is_array( $chosen_methods ) ? reset( $chosen_methods ) : '';

    if ( strpos( $chosen_shipping, 'local_pickup' ) !== false ) {
        $blocked_gateways = array( 'cod', 'bacs' );

        foreach ( $blocked_gateways as $gateway_id ) {
            unset( $gateways[ $gateway_id ] );
        }
    }

    return $gateways;
} );

Здесь важно проверить реальные ID методов оплаты в вашем магазине. У WooCommerce стандартный COD — это cod, банковский перевод — bacs, но у платёжных модулей идентификаторы могут быть другими.

Сравнение подходов: плагин, код, ручная настройка

ПодходКогда подходитМинус
Настройки WooCommerceЕсли проблема решается штатно через включение/выключение методаНе умеет гибко учитывать способ доставки
Код через woocommerce_available_payment_gatewaysЕсли нужно скрывать оплату по условиям: доставка, сумма, роль пользователяТребует проверки ID методов и тестирования
Плагин для условных платежейЕсли правил много и их должен менять менеджер без разработчикаЛишняя зависимость и риск конфликтов

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

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

После добавления кода не ограничивайтесь визуальной проверкой на одной странице. Нужно пройти весь путь оформления.

  1. Откройте корзину в режиме инкогнито.
  2. Выберите самовывоз или нужный способ доставки.
  3. Перейдите к оформлению заказа и проверьте список методов оплаты.
  4. Убедитесь, что скрытый метод не отображается ни в блоке checkout, ни после обновления доставки.
  5. Сделайте тестовый заказ и проверьте, что выбранный способ оплаты не сохраняется в заказе.

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

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

Метод оплаты не скрывается после выбора доставки

Чаще всего причина в том, что выбранный способ доставки приходит не в том виде, который вы ожидаете. У одного магазина это может быть local_pickup:1, у другого — local_pickup:3. Поэтому проверка через strpos() обычно надёжнее, чем жёсткое сравнение строки.

Код добавили в тему, а после обновления всё сломалось

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

Метод скрыт, но заказ всё равно проходит

Значит, вы убрали только отображение в интерфейсе, но не ограничили серверную проверку. Нужно именно фильтровать доступные шлюзы, а не прятать HTML/CSS-элемент на странице.

Не совпадает ID платёжного метода

У сторонних шлюзов ID может отличаться от названия, которое видит администратор. Проверьте его в настройках метода оплаты или через отладочный вывод массива $gateways. Не стоит угадывать идентификатор по названию.

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

Логика ограничения оплат должна быть минимальной и предсказуемой. Не тащите в неё лишние запросы к базе и внешним API. На checkout каждая лишняя операция заметна пользователю.

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

Если вам нужно не только скрыть оплату при самовывозе, но и убрать лишние SEO-дубли, технические страницы и мусорные элементы в магазине, часть задач можно закрыть через Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но правило скрытия методов оплаты всё равно лучше держать в коде или в специализированном модуле, а не в SEO-плагине.

Когда код лучше заменить плагином

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

Но даже тогда полезно оставить короткий технический чек-лист:

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

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

Как создать подключение к внешнему API в WordPress: практическое руководство
02.10.2026
WooCommerce: решение проблемы с отображением цен после изменения валюты
30.09.2026
Как изменить структуру URL в WordPress без потери SEO
27.09.2026
Как отключить XML-RPC в WordPress и не сломать нужные интеграции
04.09.2026
Как создать адаптивный шаблон WordPress с помощью PostCSS
06.09.2026