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

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

Задача решается без тяжёлых плагинов, если логика простая и зависит только от выбранного shipping method. Ниже разберём, как диагностировать проблему, где именно вмешиваться в WooCommerce и как проверить, что ограничение работает на реальном заказе.

Когда проблема действительно в связке доставки и оплаты

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

Что смотреть в первую очередь

  • Включена ли у товара доставка и не попадает ли он в виртуальные товары.
  • Есть ли у зон доставки корректные методы: flat_rate, local_pickup, free_shipping и т. п.
  • Не влияет ли сторонний плагин на список платежных шлюзов.
  • Не закэширован ли checkout сторонним плагином или серверным кэшем.

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

Как понять, какой shipping method выбран

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

В большинстве случаев достаточно проверить текущий выбранный метод через WC()->session->get( 'chosen_shipping_methods' ). Если в корзине несколько пакетов доставки, массив может содержать несколько значений. Для простого магазина обычно достаточно первого элемента.

$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
$chosen_method  = is_array( $chosen_methods ) && ! empty( $chosen_methods[0] ) ? $chosen_methods[0] : '';

Решение: скрыть оплату по выбранной доставке

Ниже пример, который убирает оплату cod при курьерской доставке flat_rate:1, а также скрывает онлайн-оплату yookassa при самовывозе local_pickup:2. Идентификаторы нужно заменить на свои: у каждого метода доставки и платежного шлюза они могут отличаться.

add_filter( 'woocommerce_available_payment_gateways', 'wpbono_filter_payment_gateways_by_shipping' );
function wpbono_filter_payment_gateways_by_shipping( $gateways ) {
	if ( is_admin() && ! wp_doing_ajax() ) {
		return $gateways;
	}

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

	$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
	$chosen_method  = is_array( $chosen_methods ) && ! empty( $chosen_methods[0] ) ? $chosen_methods[0] : '';

	// Курьерская доставка: скрываем оплату при получении.
	if ( 'flat_rate:1' === $chosen_method && isset( $gateways['cod'] ) ) {
		unset( $gateways['cod'] );
	}

	// Самовывоз: скрываем конкретный онлайн-шлюз.
	if ( 'local_pickup:2' === $chosen_method && isset( $gateways['yookassa'] ) ) {
		unset( $gateways['yookassa'] );
	}

	return $gateways;
}

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

Если нужно ограничить оплату не по одному методу, а по группе

Когда у вас несколько курьерских тарифов, удобнее проверять префикс метода доставки, а не точное значение. Например, все варианты flat_rate можно обрабатывать одинаково.

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

	$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
	$chosen_method  = is_array( $chosen_methods ) && ! empty( $chosen_methods[0] ) ? $chosen_methods[0] : '';

	if ( 0 === strpos( $chosen_method, 'flat_rate' ) ) {
		unset( $gateways['cod'] );
	}

	if ( 0 === strpos( $chosen_method, 'local_pickup' ) ) {
		unset( $gateways['stripe'] );
		unset( $gateways['yookassa'] );
	}

	return $gateways;
}

Сравнение подходов: код, плагин или настройка шлюза

ПодходКогда подходитМинус
Код через woocommerce_available_payment_gatewaysНужна точная логика по доставкеНужно поддерживать свои условия и ID
Настройки платежного плагинаШлюз сам умеет ограничения по стране, валюте, товарамОбычно не хватает привязки именно к shipping method
Отдельный плагин-ограничительНужен интерфейс без кодаЛишняя зависимость и риск конфликтов

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

Пошаговая настройка без ошибок

  1. Определите реальные ID методов доставки и оплаты в магазине.
  2. Добавьте код в дочернюю тему или mu-plugin.
  3. Проверьте, что фильтр срабатывает на checkout и при AJAX-обновлении.
  4. Протестируйте минимум два сценария: курьерская доставка и самовывоз.
  5. Убедитесь, что после смены доставки список оплат пересчитывается без ручной перезагрузки.

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

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

Практический чек-лист:

  • при flat_rate:1 способ cod исчезает;
  • при local_pickup:2 скрывается нужный онлайн-шлюз;
  • после смены доставки список оплат обновляется без полной перезагрузки;
  • заказ создаётся с корректным способом оплаты;
  • в админке заказа нет рассинхронизации между доставкой и оплатой.

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

Неверный ID метода доставки

Частая ошибка — использовать только flat_rate без номера экземпляра. В WooCommerce один и тот же метод в разных зонах может иметь разные суффиксы: flat_rate:1, flat_rate:3. Если условие не срабатывает, сначала посмотрите точное значение в сессии.

Проверка только на сервере без учёта AJAX

Checkout в WooCommerce часто обновляется через AJAX. Если код написан с жёсткой проверкой is_checkout() без учёта wp_doing_ajax(), список оплат может не обновляться при переключении доставки. Поэтому фильтр должен отрабатывать и в AJAX-запросах.

Скрытие не того шлюза

Идентификатор платежного шлюза не всегда совпадает с названием на экране. Например, у Stripe, YooKassa или CloudPayments внутренний ключ может отличаться от маркетингового названия. Смотрите массив доступных шлюзов через отладочный вывод или документацию конкретного плагина.

Кэш на checkout

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

Безопасность и производительность

Сам фильтр лёгкий, но в магазине с большим количеством условий лучше не плодить несколько разрозненных кусков кода. Сведите правила в одну функцию и храните пары shipping methodpayment gateway в одном месте. Это проще сопровождать и легче тестировать.

Если ограничений становится много, имеет смысл вынести конфигурацию в массив:

$rules = array(
	'flat_rate:1'     => array( 'cod' ),
	'local_pickup:2'  => array( 'yookassa', 'stripe' ),
);

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

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

WooCommerce: как запретить повторное создание заказа при наличии активного
13.07.2026
WooCommerce: как исключить товары со скидкой из способов оплаты
30.04.2026
WooCommerce: как избежать конфликтов между платежными шлюзами
12.06.2026
WooCommerce: как установить уникальный код для отложенных заказов
24.05.2026
WooCommerce: как исключить определённые товары из применения купонов
23.06.2026