Shi*_*ans 1 cookies ajax wordpress woocommerce
我们有一个自定义代码,允许最终用户选择送货城市、日期和时间。送货费率应根据城市而变化。结账页面上有城市选择框。
更改城市会触发 ajax,成功更改订单审核部分下显示的送货费用。到目前为止,一切都很好。遗憾的是,提交订单后价格并未到达订单。它在某个地方丢失了。
一个提示可能是,产品页面上也有相同的城市选择框,如果用户在添加到购物车时选择了它,然后去结帐,则会显示送货率并且不会丢失提交订单时。
是否需要触发任何刷新才能更新运费?
更新费率的函数(成功)
function adjust_shipping_rate( $rates ){
global $woocommerce;
foreach ($rates as $rate) {
$cost = $rate->cost;
$rate->cost = $_COOKIE['shipping_city_cost'];
}
return $rates;
}
add_filter( 'woocommerce_package_rates', 'adjust_shipping_rate', 50, 1 );
Run Code Online (Sandbox Code Playgroud)
更新 21-05-2017
这就是 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' );
Run Code Online (Sandbox Code Playgroud)
这是 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);
}
});
});
Run Code Online (Sandbox Code Playgroud)
至此,我有两个假设。1.) 您在结帐页面上使用此代码。2.) 你已经有了自己的函数get_shipping_cost_by_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;
}
Run Code Online (Sandbox Code Playgroud)
的设置/获取由和shipping_city_cost完成。每当结帐页面上完成更新时,我不需要在 ajax 调用中放置 ajax 函数,因为 is是一个动作钩子。WC()->session->setWC()->session->getwoocommerce_checkout_update_order_review
对于这个测试,我使用这个函数:
function get_shipping_cost_by_city( $city ) {
if ( $city == 'Ormoc City' ){
return 100;
}
return 130;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9846 次 |
| 最近记录: |