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

Продолжаю публиковать уроки про «условные методы оплаты», вы уже можете прочекать ранее опубликованные, в которых мы отключали методы оплаты в зависимости от суммы заказа и в зависимости от страны/города покупателя.

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

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

Сам сниппет кода выглядит вот так и вы вполне можете его вставить в functions.php вашей текущей темы, или же дочерней – если не хотите, чтобы всё слетело после обновлений.

add_filter( 'woocommerce_available_payment_gateways', 'truemisha_payments_on_shipping' );
 
function truemisha_payments_on_shipping( $available_gateways ) {
 
	if( is_admin() ) {
		return $available_gateways;
	}
 
	if( is_wc_endpoint_url( 'order-pay' ) ) {
		return $available_gateways;
	}
 
	$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
 
	//echo '<pre>';print_r( $chosen_methods );
 
	if ( isset( $available_gateways[ 'cod' ] ) && 'free_shipping:1' == $chosen_methods[0] ) {
		unset( $available_gateways[ 'cod' ] ); // отключаем оплату при доставке
	}
 
	return $available_gateways;
 
}
  • Прежде всего, мы ничего не делаем на странице оплаты конкретного заказа, для этого и добавлено условие функцией is_wc_endpoint_url(), про страницу оплаты заказа чуть ниже.
  • Как видно из кода, на 10-й строчке я показал, как можно узнать ярлык определённого способа доставки.
  • Если вы не знаете как узнать ярлык метода оплаты, то я чуть подробнее остановился на этом в конце этого урока.
методы оплаты в зависимости от выбранного способа доставки

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

add_filter( 'woocommerce_available_payment_gateways', 'truemisha_payments_on_shipping_2' );
 
function truemisha_payments_on_shipping_2( $available_gateways ) {
 
	if( is_admin() ) {
		return $available_gateways;
	}
 
	if( ! is_wc_endpoint_url( 'order-pay' ) || empty( $_GET[ 'key' ] ) ) {
		return $available_gateways;
	}
 
	$order_id = wc_get_order_id_by_order_key( $_GET[ 'key' ] );
	$order = wc_get_order( $order_id );
 
	if ( isset( $available_gateways[ 'cod' ] ) && $order->has_shipping_method( 'free_shipping' ) ) {  ) {
		unset( $available_gateways[ 'cod' ] );
	}
 
	return $available_gateways;
 
}

Давайте познакомимся с методами объектами WC_Order для получения информации о доставки, вы можете использовать get_shipping_methods(), чтобы получить массив со всей информацией, можете использовать get_shipping_method(), чтобы получить только название способа доставки. Я вот например использовал проверку при помощи has_shipping_method(), передав туда ярлык способа доставки.

Миша

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

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

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

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

  • Евгений 28 июля 2020 #

    Спасибо за подсказку, как раз искал подобный способ. Со своей задачей данный код справляется великолепно! Только в моем случае появились побочные эффекты! Не знаю каким боком но девятая строка в первом сниппете:
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );.
    в моем случае также повлияла на отображение списка меню в редакторе меню администратора, то есть область "Структура меню" пропала полностью! В визуальных настройках редактор меню остался. В логах нашел следующую информацию: "PHP Fatal error: Uncaught Error: Call to a member function get() on null in ..." ну и далее путь к этой строке сниппета. После того как закомментировал данную строку редактор меню заработал.
    Это как то лечится?

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

      Спасибо за вашу внимательность, да, можно легко исправить условием is_admin(), код обновил.

      • Евгений 29 июля 2020 #

        Спасибо за помощь )) все работает.

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

          Супер! ⚡️

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.