Задать вопрос
@kna999

Как добавить платные доп опции к доставке определенным методом?

Необходимо добавить доп. опции к доставке определенным методом.
Вот допустим выбрали мы платную доставку до дома, но нужен выбор платной опции разгрузка или разгрузка и подъем товара на этаж, как правильно это реализовать, получилось модифицировать код от Мишы, но работает корректно только если кликать по методу доставки и обновлять страницу через f5.

// Добавление радио-кнопок
add_action( 'woocommerce_review_order_before_payment', 'truemisha_checkout_options', 25 );
 
function truemisha_checkout_options() {
  $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );

	// сначала получаем объект из сессий
	$selected = WC()->session->get( 'gift_wrap' );
	// если пусто, то ставим значение 0
	$selected = empty( $selected ) ? '0' : $selected;
	

    if( in_array( 'flat_rate:32', $chosen_shipping_methods ) ) {
		
	// выводим радио-кнопки
	echo '<div id="truemisha-checkout-radio"><h4>Разгрузка / Подъем на этаж</h4>';
 
	woocommerce_form_field(
		'gift_wrap',
		array(
			'type' => 'radio',
			'class' => array( 'form-row-wide', 'update_totals_on_change' ),
			'options' => array(
				'0' => 'Не нужно',
				'333' => 'Разгрузка',
				'777' => 'Разгрузка + Подъем на ваш этаж',
			),
		),
		$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' ] );
	}
 
}
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы