Необходимо добавить доп. опции к доставке определенным методом.
Вот допустим выбрали мы платную доставку до дома, но нужен выбор платной опции разгрузка или разгрузка и подъем товара на этаж, как правильно это реализовать, получилось модифицировать код от Мишы, но работает корректно только если кликать по методу доставки и обновлять страницу через 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' ] );
}
}