javascript — WooCommerce — добавить плату на основе настраиваемого поля

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

Вот код, который у меня есть для моего настраиваемого поля:

add_action( 'woocommerce_after_checkout_billing_form', 'my_custom_fields' );
function my_custom_fields( $checkout ) {echo '<div id="message_fields"><h3>' . __('Add a Message') . '</h3>';
woocommerce_form_field( 'add_gift_message', array(
'type'          => 'checkbox',
'class'         => array('gift_message form-row-wide'),

'label'         => __('5x7 Enclosed Personal Message - $4'),
'placeholder'   => __(''),
), $checkout->get_value( 'add_gift_message' ));

woocommerce_form_field( 'gift_message', array(
'type'          => 'textarea',
'class'         => array('gift_message_text form-row-wide'),

'label'         => false,
'placeholder'   => __('Your message'),
), $checkout->get_value( 'gift_message' ));
echo '</div>';
}

Это работает, и поля отображаются идеально.

Внизу формы-checkout.php в моей теме я добавил этот javascript для обновления итоговой корзины при проверке поля:

<script type="text/javascript">
jQuery( document ).ready(function( $ ) {

$('#add_gift_message').click(function(){
if ( $(this).is(':checked') ) {
$('#gift_message_field').show();
var gift_message= true;
} else {
$('#gift_message_field').hide();
var gift_message = false;
}
$.ajax({
type:       'POST',
url:        wc_checkout_params.ajax_url,
data:       $( 'form.checkout' ).serialize(),
success:    function( response ) {
if ( response ) {
var order_output = $(response);
$( '#order_review' ).html( $.trim( order_output ) );
$('body').trigger('update_checkout');
}
},
error: function(code){
},
dataType: 'html'
});
});
});
</script>

Это обновляет сумму заказа и запускает следующий код (вот где проблема):

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );

function woo_add_cart_fee( $data ){
global $woocommerce;

if ( isset($_POST['add_gift_message']) )
$woocommerce->cart->add_fee( 'Personal Gift Message', '4.00', true, 'standard' );

}

Я знаю, что эта часть называется, потому что если я достану if (isset ($ _ POST [‘add_gift_message’])), это добавляет плату. У меня проблемы с определением, было ли проверено поле или нет — я не могу получить значения POST внутри woo_add_cart_fee, независимо от того, что я делаю.

Кто-нибудь знает, как заставить это работать? Спасибо!!

3

Решение

Причина, по которой вы не можете получить значение от $_POST['add_gift_message'] это потому что update_checkout является событием ajax, и он сериализует данные формы в $_POST['post_data'], Таким образом, чтобы получить значение до (ajax) и во время (не ajax) пользовательской проверки, вы можете получить это, используя следующий код:

if ( isset( $_POST['post_data'] ) ) {
parse_str( $_POST['post_data'], $post_data );
} else {
$post_data = $_POST; // fallback for final checkout (non-ajax)
}

if ( isset( $post_data['add_gift_message'] ) ) {

$woocommerce->cart->add_fee( 'Personal Gift Message', '4.00', true, 'standard' );
}

для справки, можете увидеть это сообщение

-1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector