Добавляем дополнительные платные опции на страницу оформления заказа

А вот это кстати будет интересный урок, в нём мы добавим радио-кнопки на страницу оформления заказа и в зависимости от того, какая опция выбрана, будем добавлять соответствующий сбор к общей сумме заказа.

Про страницу оформления заказа у меня на сайте есть отдельный видеоурок, вот ссылка.

Взгляните на скриншот:

Дополнительные опции заказа
Прямо перед выбором методом оплаты мы добавили радио-кнопки с выбором подарочной упаковки, цена заказа будет изменяться динамически в зависимости от выбранной опции.

Этот код вы можете добавить в functions.php вашей текущей (или дочерней) темы, либо создать плагин для этого, это легко!

// Добавление радио-кнопок
add_action( 'woocommerce_review_order_before_payment', 'truemisha_checkout_options', 25 );
 
function truemisha_checkout_options() {
 
	// сначала получаем объект из сессий
	$selected = WC()->session->get( 'gift_wrap' );
	// если пусто, то ставим значение 0
	$selected = empty( $selected ) ? '0' : $selected;
 
	// выводим радио-кнопки
	echo '<div id="truemisha-checkout-radio"><h3>Подарочная упаковка</h3>';
 
	woocommerce_form_field(
		'gift_wrap',
		array(
			'type' => 'radio',
			'class' => array( 'form-row-wide', 'update_totals_on_change' ),
			'options' => array(
				'0' => 'Обычная',
				'10' => 'Баркатная (10р)',
				'1000' => 'Из золота (1000р)',
			),
		),
		$selected 
	);
 
	echo '</div>';
 
}
 
// пересчитываем заказ и добавляем сбор, если нужно
add_action( 'woocommerce_cart_calculate_fees', 'truemisha_radio_choice_fee', 25 );
 
function truemisha_radio_choice_fee( $cart ) {
 
	// ничего не делаем в админке и если не AJAX-запрос
	if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
		return;
	}
 
	// получаем данные из сессий
	$value = WC()->session->get( 'gift_wrap' );
 
	// добавляем соответствующий сбор
	if ( $value ) {
		$cart->add_fee( 'Подарочная упаковка', $value );
	}
 
}
 
// сохраняем выбор радио-кнопки в сессии
add_action( 'woocommerce_checkout_update_order_review', 'truemisha_set_session' );
 
function truemisha_set_session( $posted_data ) {
 
	parse_str( $posted_data, $output );
 
	if ( isset( $output[ 'gift_wrap' ] ) ){
		WC()->session->set( 'gift_wrap', $output[ 'gift_wrap' ] );
	}
 
}
  • Если вы хотите добавить опции не перед выбором методом оплат, а в другое место, то спокойно можете использовать другой фильтр-хук вместо woocommerce_review_order_before_payment.
  • Также вам необязательно использовать именно радио-кнопки – достаточно лишь поменять параметр type у функции woocommerce_form_field() на 17й строчке.
  • Обратите внимание на класс update_totals_on_change на строке 18 – он необходим, иначе сумма заказа не будет автоматически обновляться при выборе вами какой-либо опции.
  • Функция is_admin() дополнительно проверяет, чтобы добавление сбора к заказу не применялось там, где не нужно. У меня уже был опыт, что обычные фронтенд хуки WooCommerce неожиданно выполнялись и в админке, причём на самых неожиданных страницах, поэтому данной условие – что-то вроде подстраховки. Но у меня есть подозрение, что тут оно не нужно.
  • Про добавление сборов к заказу уже упоминалось в этом уроке.

Миша

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

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

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

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

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

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

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