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

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

И конечно же, не забывайте, что у меня на сайте есть видеокурс по 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(), передав туда ярлык способа доставки.

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

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

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал