Отображение методов оплаты в зависимости от страны или города покупателя

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

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

В этом примере давайте попробуем отключить PayPal для… Монако? 😁 Палка вроде там не поддерживается.

Делать будем при помощи уже знакомого нам хука woocommerce_available_payment_gateways.

add_filter( 'woocommerce_available_payment_gateways', 'truemisha_gateway_by_country' );
 
function truemisha_gateway_by_country( $gateways ) {
 
	if ( isset( $gateways[ 'paypal' ] ) && 'MC' === WC()->customer->get_billing_country() ) {
		unset( $gateways[ 'paypal' ] );
	}
	return $gateways;
 
}
  • paypal – это ярлык стандартного шлюза PayPal, есть также и другие стандартные – cod, bacs, cheque
  • MC – двухбуквенный ISO-код страны, в данном случае Монако.
  • Возмжно в каких-то ситуациях вам нужно будет использовать WC()->customer->get_shipping_country() вместо WC()->customer->get_billing_country().
  • Потестил этот код в functions.php моей дочерней темы StoreFront – и он работает как для страницы Оформления заказа, так и для страницы оплаты конкретного заказа.
  • Если вы хотите проверять не страну покупателя, а например город, то можете изменить условие например так:
if ( isset( $gateways[ 'paypal' ] ) && 'Москва' === WC()->customer->get_billing_city() ) {

Если у вас возникают труности с тем, как узнать ID (ярлык) платёжного шлюза WooCommerce, то прошу взглянуть на этот скриншот:

Как узнать ID ярлык платёжного шлюза в WooCommerce
Заходим на вкладку платежи, кликаем правой кнопкой по любому методу оплату и выбираем «Проинспектировать элемент»

Миша

Недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 9

Комментирование этого поста более не доступно.
  • Андрей 29 июля 2020 #

    Спасибо! А подскажите для чайников, что нужно сделать, чтобы этот хук работал?)
    truemisha_gateway_by_country — вот это вот как и где задать?

    • Миша 29 июля 2020 #

      Вставить в functions.php текущей темы 🙂

      • Андрей 29 июля 2020 #

        Копипаст вашего кода как есть не работает((

        • Андрей 29 июля 2020 #

          Код как раз начинается с 48 строки

          Your PHP code changes were rolled back due to an error on line 48 of file wp-content/themes/urami-wp/functions.php. Please fix and try saving again.
           
          Uncaught Error: Call to a member function get_billing_country() on null in wp-content/themes/urami-wp/functions.php:48
          Stack trace:
          #0 wp-includes/class-wp-hook.php(287): true_gateway_by_country(Array)
          #1 wp-includes/plugin.php(206): WP_Hook->apply_filters(Array, Array)
          #2 wp-content/plugins/woocommerce/includes/class-wc-payment-gateways.php(160): apply_filters('woocommerce_ava...', Array)
          #3 wp-content/plugins/woocommerce-multilingual/classes/multi-currency/payment-gateways/class-wcml-currencies-payment-gateways.php(218): WC_Payment_Gateways->get_available_payment_gateways()
          #4 wp-content/plugins/woocommerce-multilingual/classes/multi-currency/payment-gateways/class-wcml-currencies-payment-gateway
        • Миша 30 июля 2020 #

          А у вас стоит плагин WooCommerce? 🙃 Сейчас специально протестировал копипаст и всё хорошо.

        • Андрей 30 июля 2020 #

          Да, стоит. Код в принципе работает, если редактировать functions на ftp, но возникает фатальная ошибка и выкидывает из админки вордпресса

        • Миша 31 июля 2020 #

          Мне трудно понять ваше последнее сообщение, но можете попробовать добавить в самое начало кода (строка 4) условие if( is_admin() ) return $gateways;

          • Андрей 31 июля 2020 #

            Спасибо! Да, так работает! А может еще подскажете, как сделать такое правило не для одной а для нескольких стран? Например, если к Монако добавить еще Украину...

          • Миша 1 августа 2020 #

            Конечно,

            if ( isset( $gateways[ 'paypal' ] ) && ( 'СТРАНА1' === WC()->customer->get_billing_country() || 'СТРАНА2' === WC()->customer->get_billing_country() ) ) {