Отключение методов оплаты в зависимости от суммы заказа

В этом уроке я покажу, как в зависимости от суммы заказа в корзине (в заказе), вы можете управлять тем, какой метод оплаты отображать.

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

Кстати, в обоих случаях это делается при помощи фильтр-хука woocommerce_available_payment_gateways.

Также рекомендую свой видеокурс по WooCommerce! 🚀

1. На странице оформления заказа

В примере ниже мы отключаем оплату при получении для заказов, чья сумма больше 1000 в валюте магазина.

add_filter( 'woocommerce_available_payment_gateways', 'truemisha_turn_off_cod' );
 
function truemisha_turn_off_cod( $available_gateways ) {
 
	if( is_wc_endpoint_url( 'order-pay' ) ) {
		return $available_gateways;
	}
 
	if ( WC()->cart->total > 1000 ) {
		unset( $available_gateways['cod'] ); // отключаем оплату при доставке
	}
 
	return $available_gateways;
 
}
  • WC()->cart->total считает общую сумму заказа, с учётом стоимости доставки, если вы хотите подсчитать только сумму товаров в корзине, то используйте WC()->cart->subtotal
  • cod это ярлык метода оплаты «Оплата при доставке», как узнать другие? Ну во-первых, print_r() никто не отменял, во вторых, стандартные это bacs (Прямой банковский перевод), cheque (Чековые платежи) и paypal.
  • Также на строке 5 при помощи функции is_wc_endpoint_url() мы делаем проверку, что находимся НЕ на странице оплаты конкретного заказа, всё дело в том, что там сумма заказа будет вычисляться совсем другим спосбом. Обратите внимание, что условный тег is_checkout() нам не подходит.
  • Если не знаете, куда вставлять код из урока – вставляйте в functions.php текущей темы.

2. На странице оплаты конкретного заказа

add_filter( 'woocommerce_available_payment_gateways', 'truemisha_turn_off_cod_pay_4_order' );
 
function truemisha_turn_off_cod_pay_4_order( $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 ( $order->get_total() > 1000 ) {
		unset( $available_gateways['cod'] ); // отключаем оплату при доставке
	}
 
	return $available_gateways;
 
}
  • Код очень похож на предыдущий, самое большое отличие наверное в том, что мы получаем сумму заказа не из объекта в корзине, а из $_GET[ 'key' ], который можно преобразовать в ID оплачиваемого заказа, потом в объект заказа, а из объекта уже легко узнать либо общую сумму методом get_total(), либо стоимость товаров в корзине методом get_subtotal().

Миша

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

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

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

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

Комментирование этого поста более не доступно.
  • Илья 11 мая 2020 #

    Добрый день.
    А если я хочу оставить только оплату онлайн, если в Корзине лежит только определённый товар без добавления других? Можете примерикода написать?
    Спасибо

    • Миша 11 мая 2020 #

      Добрый,

      Да, хорошо, в среду опубликую.

    • Миша 13 мая 2020 #

      Сорри, передумал.

      Итак, прежде всего вы можете использовать тот же хук woocommerce_available_payment_gateways.

      После этого прочекайте этот урок про проверку того, что товар в корзине.

      И используйте какую-то переменную например, которую вы будете изменять на true или false в процессе ваших проверок. А по итогу проверок если эта переменная например true, то отключаете всё, кроме оплаты онлайн.