Сценарий типичный: магазин работает по предоплате, но в 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 и не дублирует логику доставки.
Проверка результата после внедрения
После добавления кода не ограничивайтесь визуальной проверкой на одной странице. Нужно пройти весь путь оформления.
- Откройте корзину в режиме инкогнито.
- Выберите самовывоз или нужный способ доставки.
- Перейдите к оформлению заказа и проверьте список методов оплаты.
- Убедитесь, что скрытый метод не отображается ни в блоке checkout, ни после обновления доставки.
- Сделайте тестовый заказ и проверьте, что выбранный способ оплаты не сохраняется в заказе.
Если у вас включён кэш на 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 поведение изменится.