woocommerce custom checkout, чтобы добавить плату за заказ ajax

Я пытаюсь объявить пользовательскую плату на общую сумму заказа при оформлении заказа. Я добавил флажок в woocommerce

add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' ); function add_box_option_to_checkout( $checkout ) { echo '<div id="message_fields">'; woocommerce_form_field( 'add_gift_box', array( 'type' => 'checkbox', 'class' => array('add_gift_box form-row-wide'), 'label' => __('Ilość pudełek ozdobnych - 25 PLN/szt'), 'placeholder' => __(''), ), $checkout->get_value( 'add_gift_box' )); } 

Включил пользовательский файл js, который должен обрабатывать событие

 jQuery( document ).ready(function( $ ) { $('#add_gift_box').click(function(){ var data = { action: 'woocommerce_add_gift_box', state: '200', }; jQuery.ajax({ type: 'POST', url: wc_checkout_params.ajax_url, data: data, success: function (code) { console.log(code); jQuery('body').trigger('update_checkout'); }, dataType: 'html' }); }); }); . jQuery( document ).ready(function( $ ) { $('#add_gift_box').click(function(){ var data = { action: 'woocommerce_add_gift_box', state: '200', }; jQuery.ajax({ type: 'POST', url: wc_checkout_params.ajax_url, data: data, success: function (code) { console.log(code); jQuery('body').trigger('update_checkout'); }, dataType: 'html' }); }); }); 

И функция обработки платежей php

 function woo_add_cart_fee( $data ){ if ( is_admin() && ! defined( 'DOING_AJAX' ) || ! $_POST ) return; $extracost = 0; if (isset($_POST['state'])) { $extracost = intval($_POST['state']); } WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost ); } add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' ); add_action('wp_ajax_woocommerce_add_gift_box', 'woo_add_cart_fee', 10); add_action('wp_ajax_nopriv_woocommerce_add_gift_box', 'woo_add_cart_fee', 10); 

По некоторым причинам значение $ _POST ['state'] не добавлено, функция работает, когда я даю жестко закодированное значение, я пробовал много вариантов, но не могу заставить это работать.

Я видел подобные записи, но никто из них не ответил.

Почтовые данные отправляются функциями AJAX в «post_data», сериализованы. Поэтому, чтобы получить значение вашего флажка, вам нужно только parse_str() !

 parse_str( $_POST['post_data'], $post_data ); 

то вы можете получить свой вариант «add_gift_box» из $post_data['add_gift_box'] . Обратите внимание, что после завершения заказа этот элемент «post_data» больше не доступен, и все в $_POST .

Полный пример, основанный на вашем коде:


1) добавление флажка в чек

 add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' ); function add_box_option_to_checkout( $checkout ) { echo '<div id="message_fields">'; woocommerce_form_field( 'add_gift_box', array( 'type' => 'checkbox', 'class' => array('add_gift_box form-row-wide'), 'label' => __('Ilość pudełek ozdobnych - 25 PLN/szt'), 'placeholder' => __(''), ), $checkout->get_value( 'add_gift_box' )); echo '</div>'; } 

2) для обновления корзины при щелчке по галочке (нет необходимости в дополнительных запросах AJAX!)

 add_action( 'wp_footer', 'woocommerce_add_gift_box' ); function woocommerce_add_gift_box() { if (is_checkout()) { ?> <script type="text/javascript"> jQuery( document ).ready(function( $ ) { $('#add_gift_box').click(function(){ jQuery('body').trigger('update_checkout'); }); }); </script> <?php } } . add_action( 'wp_footer', 'woocommerce_add_gift_box' ); function woocommerce_add_gift_box() { if (is_checkout()) { ?> <script type="text/javascript"> jQuery( document ).ready(function( $ ) { $('#add_gift_box').click(function(){ jQuery('body').trigger('update_checkout'); }); }); </script> <?php } } 

3) действие, чтобы добавить плату

 add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' ); function woo_add_cart_fee( $cart ){ if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) { return; } 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_box'])) { $extracost = 25; // not sure why you used intval($_POST['state']) ? WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost ); } } 

Это круто!! Большое спасибо. Я немного изменил его, чтобы добавить процент. Я знаю, что это не лучший ответ, но у меня нет репутации, чтобы поднять ваш ответ. Для тех, кто застрял как я ..

 add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' ); function woo_add_cart_fee( $cart ){ global $woocommerce; if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) { return; } 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_box'])) { $percentage = 0.01; $surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage; $woocommerce->cart->add_fee( 'Surcharge', $surcharge, true, '' ); } }