Ajax 在WooCommerce网站的结帐页面上更新运费

Ajax 在WooCommerce网站的结帐页面上更新运费,ajax,wordpress,cookies,woocommerce,Ajax,Wordpress,Cookies,Woocommerce,我们有一个自定义代码,允许最终用户选择城市,日期和时间,他的交货。交货率应根据城市的不同而变化。城市选择框位于签出页面上 更改城市会触发ajax,成功更改订单审阅部分下显示的交货费用。到现在为止,一直都还不错。 遗憾的是,提交订单后价格未达到订单要求。它在某处迷路了 一个提示可能是,产品页面上也有相同的城市选择框,如果用户在添加到购物车时选择了它,然后才去结帐,则会显示交货率,并且在提交订单时不会丢失 是否需要触发刷新以更新运费 更新费率的功能(成功) 更新日期:2017年5月21日 这就是co

我们有一个自定义代码,允许最终用户选择城市,日期和时间,他的交货。交货率应根据城市的不同而变化。城市选择框位于签出页面上

更改城市会触发ajax,成功更改订单审阅部分下显示的交货费用。到现在为止,一直都还不错。 遗憾的是,提交订单后价格未达到订单要求。它在某处迷路了

一个提示可能是,产品页面上也有相同的城市选择框,如果用户在添加到购物车时选择了它,然后才去结帐,则会显示交货率,并且在提交订单时不会丢失

是否需要触发刷新以更新运费

更新费率的功能(成功)

更新日期:2017年5月21日

这就是cookie的更新方式:一旦选择框被更改,就会触发异步ajax调用并执行以下PHP代码

function get_and_set_shipping_rate(){
    $shipping_city = $_POST['city'];
    $shipping_cost = get_shipping_cost_by_city($shipping_city);
    setcookie('shipping_city_cost', $shipping_cost, time() + (86400 * 30), '/'); 
    $_COOKIE['shipping_city_cost'] = $shipping_cost;
    echo 'Shipping cost updated: '.$shipping_city.' : '.$shipping_cost;
}

add_action( 'wp_ajax_get_and_set_shipping_rate', 'get_and_set_shipping_rate' );
add_action( 'wp_ajax_nopriv_get_and_set_shipping_rate', 'get_and_set_shipping_rate' );
这里是ajax调用:

jQuery(document).on('change', '#shipping_delivery_city', function(){
     var requested_city = jQuery(this).val();
        var data = {
                'action': 'get_and_set_shipping_rate',
                'city': requested_city
            };

            jQuery.ajax({
                type: "POST",
                url: shipping_dates.ajax_url,
                data: data,
                async: false,
                success: function (response) {
                    console.log(response);
                }
            });
});

基于此,我有两个假设。1. ) 您正在签出页面上使用此代码。2. ) 您已经有了自己的功能
get\u shipping\u cost\u by\u city

add_action( 'woocommerce_checkout_update_order_review', 'woocommerce_checkout_update_order_review' );
function woocommerce_checkout_update_order_review( $post_data ){

    $data = array();
    $vars = explode('&', $post_data);
    foreach ($vars as $k => $value){
        $v = explode('=', urldecode($value));
        $data[$v[0]] = $v[1];
    }
    $shipping_cost = get_shipping_cost_by_city( $data['billing_city'] );
    WC()->session->set( 'shipping_city_cost', $shipping_cost );
    foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ) {
        // this is needed for us to remove the session set for the shipping cost. Without this, we can't set it on the checkout page.
        WC()->session->set( 'shipping_for_package_' . $package_key, false );
    }

}

add_filter( 'woocommerce_package_rates', 'adjust_shipping_rate', 50 );
function adjust_shipping_rate( $rates ){

    foreach ($rates as $rate) {
        $cost = $rate->cost;
        $rate->cost = WC()->session->get( 'shipping_city_cost' );
    }
    return $rates;
}
通过
WC()->session->set
WC()->session->get
完成
shipping\u city\u成本的设置/获取。我不需要为
woocommerce\u checkout\u update\u order\u review
设置一个ajax函数,只要在checkout页面上完成更新,它就是ajax调用中的一个操作挂钩

对于此测试,我使用以下函数:

function get_shipping_cost_by_city( $city ) {
    if ( $city == 'Ormoc City' ){
        return 100;
    }
    return 130;
}

基于此,我有两个假设。1. ) 您正在签出页面上使用此代码。2. ) 您已经有了自己的功能
get\u shipping\u cost\u by\u city

add_action( 'woocommerce_checkout_update_order_review', 'woocommerce_checkout_update_order_review' );
function woocommerce_checkout_update_order_review( $post_data ){

    $data = array();
    $vars = explode('&', $post_data);
    foreach ($vars as $k => $value){
        $v = explode('=', urldecode($value));
        $data[$v[0]] = $v[1];
    }
    $shipping_cost = get_shipping_cost_by_city( $data['billing_city'] );
    WC()->session->set( 'shipping_city_cost', $shipping_cost );
    foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ) {
        // this is needed for us to remove the session set for the shipping cost. Without this, we can't set it on the checkout page.
        WC()->session->set( 'shipping_for_package_' . $package_key, false );
    }

}

add_filter( 'woocommerce_package_rates', 'adjust_shipping_rate', 50 );
function adjust_shipping_rate( $rates ){

    foreach ($rates as $rate) {
        $cost = $rate->cost;
        $rate->cost = WC()->session->get( 'shipping_city_cost' );
    }
    return $rates;
}
通过
WC()->session->set
WC()->session->get
完成
shipping\u city\u成本的设置/获取。我不需要为
woocommerce\u checkout\u update\u order\u review
设置一个ajax函数,只要在checkout页面上完成更新,它就是ajax调用中的一个操作挂钩

对于此测试,我使用以下函数:

function get_shipping_cost_by_city( $city ) {
    if ( $city == 'Ormoc City' ){
        return 100;
    }
    return 130;
}

您如何设置
$\u COOKIE['shipping\u city\u cost']
?@Reigel感谢您的帮助。请看上面的更新。这些代码只需要在结帐页上吗?它工作得很好,但当我选择另一种运输方式,如提货交货时,运输成本不会改变。有人能告诉我,当我选择另一种方式时,运输成本将为零(我的意思是选择另一种运输方式时没有成本)。您如何设置
$\u COOKIE['shipping\u city\u cost']
?@Reigel感谢您的帮助。请查看上面的更新。这些代码是否仅在结帐页面上需要?它工作正常,但当我选择另一种发货方式(如提货发货)时,发货成本不会发生变化。有谁能告诉我,当我选择另一种方式时,发货成本将为零(我的意思是选择另一种运输方式不需要任何成本。我相信这是wright的方式,因为我觉得这是合乎逻辑的,我也做了同样的代码,但我的问题是,当我改变城市时,“woocommerce\u checkout\u update\u order\u review”不会触发。我相信这是wright的方式,因为我觉得这是合乎逻辑的,我已经做了相同的代码,但我的问题是当我改变城市时,“woocommerce\u checkout\u update\u order\u review”不会启动