【问题标题】:WooCommerce add a custom fee using ajax to cart totals on checkout pageWooCommerce 在结帐页面上使用 ajax 向购物车总计添加自定义费用
【发布时间】:2015-07-29 14:15:58
【问题描述】:

I am trying make it when user changes the Shipping address select dropdown it dynamically add a fee to cart totals using ajax.I could able to to get the value but when select a another state it wont update the totals.

我的 ajax 请求:

jQuery(document).ready(function () {
    jQuery('#shipping_state').change(function () {
        var data = {
            action: 'woocommerce_custom_fee',
            security: wc_checkout_params.update_order_review_nonce,
            add_order_fee: 'state',
            post_data: jQuery('form.checkout').serialize()
        };
        jQuery.ajax({
            type: 'POST',
            url: wc_checkout_params.ajax_url,
            data: data,
            success: function (code) {
                var result = '';
                result = jQuery.parseJSON(code);
                if (result.result === 'success') {

                    jQuery('body').trigger('update_checkout');
                }
            },
            dataType: 'html'
        });
        return false;
    });
})
在functions.php中

add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee');

function woo_add_cart_fee() {
global $woocommerce;
$destsuburb = $woocommerce->customer->get_shipping_state();

/*Then I use $destsuburb as a variable to API and get a shipping cost returning $shipping_cost*/

$woocommerce->cart->add_fee('Shipping and Handling:', $shipping_cost);
}

我根据州获得不同的运费,但它没有通过 add_fee() 改变前端值

【问题讨论】:

    标签: php ajax wordpress woocommerce woothemes


    【解决方案1】:

    最后我找到了一个解决方案,使用会话变量来存储 Ajax 值和 add_fee()

    我的 ajax 请求:

    jQuery(document).ready(function () {
    
        jQuery('#State').click(function () {
            if (jQuery('#ship-to-different-address-checkbox').is(':checked')) {
                var state = jQuery('#shipping_state').val();
                var post_code = jQuery('#shipping_postcode').val();
            } else {
                var state = jQuery('#billing_state').val();
                var post_code = jQuery('#billing_postcode').val();
    
            }
            console.log(state + post_code);
            var data = {
                action: 'woocommerce_apply_state',
                security: wc_checkout_params.apply_state_nonce,
                state: state,
                post_code: post_code
            };
    
            jQuery.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: data,
                success: function (code) {
                    console.log(code);
    //                jQuery('.woocommerce-error, .woocommerce-message').remove();
    
                    if (code === '0') {
    //                    $form.before(code);
                        jQuery('body').trigger('update_checkout');
                    }
                },
                dataType: 'html'
            });
    
            return false;
        });
    
    });

    在functions.php中

    wp_enqueue_script('neemo_state', get_template_directory_uri() . '/js/state_test.js', array('jquery'));
    wp_localize_script('neemo_state', 'wc_checkout_params', array('ajaxurl' => admin_url('admin-ajax.php')));
    
    add_action('wp_ajax_woocommerce_apply_state', 'calculate', 10);
    add_action('wp_ajax_nopriv_woocommerce_apply_state', 'calculate', 10);
    
    function calculate() {
        if (isset($_POST['state'])) {
            global $woocommerce;
            $weight = WC()->cart->cart_contents_weight;
            $state = $_POST['state'];
            if ($state === "VIC") {
                $val = 1;
            } else {
                $val = 2;
            }
            session_start();
            $_SESSION['val'] = $val;
        }
    }
    
    add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee');
    
    function woo_add_cart_fee() {
        session_start();
        $extracost = $_SESSION['val'];
        WC()->cart->add_fee('Shipping & Handling:', $extracost);
    }

    【讨论】:

      【解决方案2】:

      我必须在结帐前编写代码以接受捐赠,并将该捐赠金额作为费用添加到购物车中 - 并为用户提供灵活性,以便在继续付款之前多次更改捐赠金额。我使用了以下代码,效果很好。我有捐赠金额和一个 donateNow 按钮 -

      function.php 中的代码

      add_action( 'wp_footer', 'woocommerce_click_donate_button', 80 );
      function woocommerce_click_donate_button() {
          if (is_checkout()) {
          ?>
          <script type="text/javascript">
          jQuery( document ).ready(function( $ ) {
              $('#donateNowBtn').click(function(){
                  jQuery('body').trigger('update_checkout');
              });
          });
          </script>
          <?php
          }
      }
      
      
      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['donation_amount'])) {
              $donation_amount = $post_data['donation_amount'] ;
              WC()->cart->add_fee( 'Donation Amount', $donation_amount );
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-10
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        相关资源
        最近更新 更多