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

Типичный сценарий: в магазине есть самовывоз, и для него не нужна онлайн-оплата. Но WooCommerce продолжает показывать все активные платежные методы, из-за чего покупатель видит лишние варианты, а менеджер получает заказы с неправильной логикой оплаты. Решается это либо настройками плагинов доставки/оплаты, либо кодом через фильтр woocommerce_available_payment_gateways.

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

Когда проблема проявляется и что именно проверять

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

Быстрая диагностика

  • Откройте страницу оформления заказа в режиме инкогнито.
  • Выберите самовывоз и посмотрите, меняется ли список способов оплаты.
  • Проверьте, не включен ли кэш на checkout-странице или в плагине оптимизации.
  • Убедитесь, что у вас не стоит отдельный плагин, который переопределяет checkout или payment gateways.
  • Посмотрите, как называется метод доставки в вашей установке: чаще всего это local_pickup, но у некоторых плагинов доставки могут быть свои идентификаторы.

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

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

Самый практичный вариант — добавить фильтр в functions.php дочерней темы или в небольшой mu-plugin. Ниже пример, который убирает все платежные методы, если в выбранных способах доставки есть local_pickup.

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

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

	$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );

	if ( empty( $chosen_methods ) || ! is_array( $chosen_methods ) ) {
		return $gateways;
	}

	foreach ( $chosen_methods as $method ) {
		if ( false !== strpos( $method, 'local_pickup' ) ) {
			return array();
		}
	}

	return $gateways;
}

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

Вариант: оставить только оплату наличными

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

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

	$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );

	if ( empty( $chosen_methods ) || ! is_array( $chosen_methods ) ) {
		return $gateways;
	}

	$pickup_selected = false;

	foreach ( $chosen_methods as $method ) {
		if ( false !== strpos( $method, 'local_pickup' ) ) {
			$pickup_selected = true;
			break;
		}
	}

	if ( ! $pickup_selected ) {
		return $gateways;
	}

	foreach ( $gateways as $gateway_id => $gateway ) {
		if ( 'cod' !== $gateway_id ) {
			unset( $gateways[ $gateway_id ] );
		}
	}

	return $gateways;
}

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

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

Если задача постоянная, лучше не завязываться на ручные действия менеджера. Ниже — короткое сравнение вариантов.

ПодходКогда подходитМинус
Настройки плагина доставки/оплатыЕсли плагин умеет правила по методу доставкиЗависимость от конкретного расширения
Код через woocommerce_available_payment_gatewaysНужна точная логика и контрольНужно аккуратно тестировать на checkout
Ручное отключение шлюзов в WooCommerceЕсли самовывоз всегда без оплатыНе решает сценарии с разными зонами и условиями

Если у вас уже стоит плагин оптимизации вроде Clearfy Pro, его имеет смысл использовать для общей гигиены сайта, но не как замену логике checkout. Для этой задачи важнее именно предсказуемый фильтр, а не «чистка» интерфейса.

Пошаговое внедрение без сюрпризов

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

Если хотите вынести код в mu-plugin, используйте простой файл, например wp-content/mu-plugins/disable-payments-for-pickup.php:

<?php
/**
 * Plugin Name: Disable payments for local pickup
 */

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

	$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );

	if ( empty( $chosen_methods ) || ! is_array( $chosen_methods ) ) {
		return $gateways;
	}

	foreach ( $chosen_methods as $method ) {
		if ( false !== strpos( $method, 'local_pickup' ) ) {
			return array();
		}
	}

	return $gateways;
}

Как проверить, что решение сработало

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

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

Для дополнительной проверки можно временно включить логирование в коде через error_log(), но не оставляйте это в продакшене надолго. Лучше убрать отладку после подтверждения результата.

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

Метод доставки называется не local_pickup

Это самая частая причина, почему код «не работает». Некоторые плагины доставки используют собственные идентификаторы или добавляют суффиксы. Откройте заказ или временно выведите значение chosen_shipping_methods, чтобы увидеть реальный ID.

Кэшируетcя checkout-страница

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

Фильтр подключен не там

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

Платежный шлюз сам переопределяет доступность

Некоторые шлюзы дополнительно проверяют географию, валюту или состав корзины. Тогда ваш фильтр может сработать, но шлюз все равно не появится по своим внутренним правилам. Это нормально, если логика совпадает с ожиданиями.

Безопасность и поддержка в долгую

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

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

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

WooCommerce: автоматическое одобрение и отклонение заказов по условиям
13.09.2026
WooCommerce: как автоматически очищать корзину и историю заказов по времени
30.09.2026
WooCommerce: автоматическое изменение статуса заказа при оплате
15.08.2026
Как устроить автоматический отчет о ошибках WordPress с уведомлениями на почту
25.09.2026
WooCommerce: решение проблемы с отправкой писем о подтверждении заказа
18.09.2026