简体   繁体   English

在WooCommerce中使用AJAX更新购物车运输数据

[英]Update cart shipping data with AJAX in WooCommerce

I'm trying to update my checkout cart's shipping with AJAX... 我正在尝试使用AJAX更新我的结帐购物车...

I've got the action in functions.php 我在functions.php中有了这个动作

function jwd_update_shipping()
{
    WC()->cart->calculate_shipping();

    echo "hi";
    die();
}
add_action('jwd_update_shipping_callback', 'jwd_update_shipping');

Then in js I call it, like so 然后在js我称之为,就像这样

jQuery.ajax({
    type: "POST",
    url: 'MYSITE.com/wp-admin/admin-ajax.php',
    data: ({
        action: "jwd_update_shipping"
    }),
    success: function(response) {
        console.log("got this: " + response);
        if (response.type == "success") {
            alert("here");
            jQuery('body').trigger('update_checkout');
        } else {
            alert("fail");
        }
    },
    error: function(request, status, error) {
        alert(request.responseText);
    }
});

I just get a 0 alerted back at me, which suggests that the AJAX call failed. 我刚收到0警告,这表明AJAX调用失败了。

First your ajax request is not reaching the related php function… Also you need more things to refresh checkout… Try the following instead: 首先你的ajax请求没有达到相关的php函数...你需要更多的东西来刷新结账...请尝试以下代码:

// The jQuery script that send the Ajax request
add_action( 'wp_footer', 'refresh_shipping_js' );
function refresh_shipping_js() {
    // Only on checkout
    if( is_checkout() && ! is_wc_endpoint_url() ):
    ?>
    <script type="text/javascript">
    jQuery( function($){
        if (typeof wc_checkout_params === 'undefined') 
            return false;

        var refresh = 'yes';

        $.ajax({
            type: "POST",
            url: wc_checkout_params.ajax_url,
            data: ({
                'action': 'updating_shipping',
                'refresh_shipping': refresh,

            }),
            success: function(response) {
                if( response === '1' ) {
                    $(document.body).trigger('update_checkout');
                    console.log('Success: '+response); // For testing (to be removed)
                } else {
                    console.log('Failled: '+response); // For testing (to be removed)
                }
            },
            error:function(error) {
                console.log('Error: '+error); // For testing (to be removed)
            }
        });
    });
    </script>
    <?php
    endif;
}

// function that gets the Ajax data
add_action( 'wp_ajax_updating_shipping', 'updating_shipping' );
add_action( 'wp_ajax_nopriv_updating_shipping', 'updating_shipping' );
function updating_shipping() {
    if ( isset($_POST['refresh_shipping']) && $_POST['refresh_shipping'] === 'yes' ){
        WC()->session->set('refresh_shipping', '1' );
    } else {
        WC()->session->set('refresh_shipping', '0' );
    }
    echo  WC()->session->get('refresh_shipping');
    die(); // Alway at the end (to avoid server error 500)
}

// Function that refresh session shipping methods data
add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 );
function refresh_shipping_methods( $post_data ){
    if ( WC()->session->get('refresh_shipping' ) === '1' ) {
        foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){
            WC()->session->set( 'shipping_for_package_' . $package_key, false );
        }
        WC()->cart->calculate_shipping();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM