结帐距离使用WooCommerce 3.3中的Google Map API进行计算
几个月前我发布了一个类似的问题 ,我得到了帮助解决它。 它在Woocommerce版本3.1.2之前工作正常。 我一直在更新到最新版本的WooCommerce,希望问题能够得到解决。
我根据结账时客户的billing_area
(自定义下拉列表)与卖家的billing_city
(在用户个人资料中设置)之间的差异添加动态费用。 我使用的代码如下 –
这是运行的jQuery脚本,以使billing_area的值更改为:
add_action( 'woocommerce_after_checkout_form', 'custom_checkout_jquery_script', 10 ); function custom_checkout_jquery_script() { ?> (function($){ $( 'form.checkout' ).on( 'change', '#billing_area', function(){ var location = $('#billing_area option:selected').val(); document.cookie="cusarea="+location; // Browser console output (Just for testing) function readCookie(n){ for(var r=n+"=",t=document.cookie.split(";"),e=0;e<t.length;e++){ for(var i=t[e];" "==i.charAt(0);)i=i.substring(1,i.length); if(0==i.indexOf(r))return i.substring(r.length,i.length)}return null} $('body').trigger('update_checkout'); console.log('Selected Area: '+location+' | Cookie: '+readCookie("cusarea")); //$('#order_review').load(document.URL + ' #order_review'); //window.location.reload(true) }); })(jQuery); <?php }
这是计算费用的代码:
add_action( 'woocommerce_cart_calculate_fees', 'distance_shipping_fee', 30, 1 ); function distance_shipping_fee( $wc_cart ){ if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if( empty($_COOKIE ['cusarea']) ) return; else $cookie = $_COOKIE ['cusarea']; // Encoding the customer's location for Google API $customer_area = rawurlencode( $cookie ); // Getting billing city of vendors foreach( $wc_cart->get_cart() as $cart_item ){ $vendor_id = get_post_field( 'post_author', $cart_item['product_id'] ); $vendors[$vendor_id] = get_user_meta($vendor_id, 'billing_city', true); } foreach( $vendors as $vend_loc){ // Setting Google API URL ## $gapi_key = MY_APY; // Set HERE your google api key $shippingurl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$vend_loc"; $shippingurl .= "+dhaka+bangladesh&destinations=$customer_area+dhaka+bangladesh&key=$gapi_key"; // Now fetching json response from googleapis: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $shippingurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = json_decode(curl_exec($ch), true); // If google responds with a status of OK: Extract the distance text: if($response['status'] == "OK") $dist = $response['rows'][0]['elements'][0]['distance']['text']; $dist_array[] = preg_replace("/[^0-9\.]/", '', $dist); } // Get the bigger distance $dist_ance = max($dist_array); $dist_abs = abs ($dist_ance); if ( $dist_abs add_fee( "Delivery - Distance Rate", 10 , true); } else { $wc_cart->add_fee( "Delivery - Distance Rate", 20 , true); } }
问题是 – 它不再起作用了。
如果我转储该值,它会返回$dist_abs
的值(类似于5.4,这是卖方位置和客户区域之间的距离)。 但是,购物车不收费。
有时,当服务器或网站速度很慢时,我会看到标签(交付 – 距离率)出现在订单查看中,但一旦页面正确加载就会消失。
任何人都可以告诉我为什么它不再工作了吗? 有什么我想念的吗?
我找到了使用ajax而不是cookie来使其工作的方法……所以尝试以下方法:
add_action( 'woocommerce_after_checkout_form', 'custom_checkout_jquery_script', 30 ); function custom_checkout_jquery_script() { if( ! is_checkout() ) return; ?> session->set('customer_area', rawurlencode($_POST['customer_area']) ); // To be removed (testing: Send back the data to jQuery) echo json_encode( WC()->session->get('customer_area' ) ); die(); // To avoid server error 500 } // Add a fee based on the highest distance between customer and vendors add_action( 'woocommerce_cart_calculate_fees', 'distance_shipping_fee', 30, 1 ); function distance_shipping_fee( $cart ){ if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Get Url encoded customer area that is saved in WC_Session by ajax $customer_area = WC()->session->get('customer_area' ); // Only when customer area has been selected if( empty($customer_area) ) return; // Getting billing city of vendors foreach( $cart->get_cart() as $cart_item ){ $vendor_id = get_post_field( 'post_author', $cart_item['product_id'] ); $vendors[$vendor_id] = get_user_meta($vendor_id, 'billing_city', true); } $dist_array = array(); // Loop through vendors locations foreach( $vendors as $vend_loc){ // Setting Google API URL ## $gapi_key = MY_APY; // Set HERE your google api key $shippingurl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$vend_loc"; $shippingurl .= "+dhaka+bangladesh&destinations=$customer_area+dhaka+bangladesh&key=$gapi_key"; // Now fetching json response from googleapis: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $shippingurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = json_decode(curl_exec($ch), true); // If google responds with a status of OK: Extract the distance text: if($response['status'] == "OK") $dist = $response['rows'][0]['elements'][0]['distance']['text']; $dist_array[] = preg_replace("/[^0-9\.]/", '', $dist); } // Get the bigger distance $distance = max ($dist_array); $distance = abs ($distance); $fee = $distance < 5 ? 10 : 20; if ( $distance && $fee > 0 ) $cart->add_fee( "Delivery - Distance Rate", $fee , true); }
代码位于活动子主题(或活动主题)的function.php文件中。 经过测试和工作。
一旦工作,您将必须删除所有相关的行// Testing ==> To be removed