通过WooCommerce中的Google API计算距离运费的购物车费用
问题描述:
因此,我从SO和互联网获得一些帮助后编写了一段代码。我想通过计算供应商位置(billing_city
)和客户区域之间的距离Google Maps API Distance-Matrix
来为购物车添加费用。在这里,我使用计费表单后的下拉菜单来获取客户区域。通过WooCommerce中的Google API计算距离运费的购物车费用
我有问题从cookie获取值并将该变量传递给下一个函数。 FYKI,我已将此代码插入到我的子主题功能中。
add_action('wp_footer', 'calculate_distance_between_two_locations');
function calculate_distance_between_two_locations($dist) {
// I am getting first item of the cart
foreach(WC()->cart->get_cart() as $cart_item){
$product_id = $cart_item['product_id'];
break;
}
//Now I am fetching vendor's id and location of the item
$vendor_id = get_post_field('post_author', $product_id);
$vendor_location = get_user_meta($vendor_id, 'billing_city', true);
//Here I'm fetching the value from customer location
//I am using a dropdown/select named billing_myfield5
if (is_checkout()) {?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('#billing_myfield5').change(function(){
jQuery('body').trigger('update_checkout');
var location = $('#billing_myfield5 option:selected').text();
document.cookie="cusarea="+location;
});
});
</script>
<?php
}
//Encoding the customer's location for Google API
//and putting it into a variable
$customer_area = rawurlencode($_COOKIE ['cusarea']);
//I am setting Google API
$shippingurl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$vendor_location."&destinations=".$customer_area."&key=MY_API_KEY";
//Now fetching json response from googleapis.com:
$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'];
}
//Getting the integers from the string
$dist_ance = preg_replace("/[^0-9\.]/", '', $dist);
//Finally putting the value in session
session_start();
$_SESSION['dist'] = $dist_ance;
}
所以,现在我应该有$_SESSION['dist']
的值,我应该能够将它传递给在同一个页面的另一个功能。以下是我用来计算购物车费用的代码。
add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee');
function woo_add_cart_fee($cart){
if (! $_POST || (is_admin() && ! is_ajax())) {
return;
}
if($_SESSION['dist']){
$customshipcost = $dist_ance;
if (is_admin() && ! defined ('DOING_AJAX'))
WC()->cart->add_fee('Distance Delivery Charge', $customshipcost , true);
}
}
嗯,我实际上有两个问题。任何帮助将非常感激。
- 有时我从cookie获得价值,有时候我没有。我使用echo 来检查它是否给我的价值。
- 会话没有响应。我的购物车中收到“0”作为费用。
FYKI,我只是试图只显示数字距离作为收费的车在眼下。
答
这里是获取woocommerce_cart_calculate_fees
动作钩子中选定位置值的正确方法。我已经把这个钩子函数中的所有php代码都移走了。
在一个自定义函数中挂钩了woocommerce_after_checkout_form
动作钩子,我已经添加了你修改过的jQuery代码。
我已经测试了一切(但不是谷歌API部分和距离计算费用),它的工作现场:每次选择一个值,它在费用函数中更新。
下面是代码:
add_action('woocommerce_after_checkout_form', 'custom_checkout_jquery_script', 10);
function custom_checkout_jquery_script() {
// Setting the country in customer data and session
$country_code = 'BD'; // For Bangladesh
WC()->session->set('country', $country_code);
WC()->session->set('billing_country', $country_code);
WC()->session->set('shipping_country', $country_code);
WC()->customer->set_billing_country($country_code);
WC()->customer->set_shipping_country($country_code);
// The jQuery code
?>
<script type="text/javascript">
(function($){
// Initializing (get the default value)
var location = $('#billing_myfield5 option:selected').html();
document.cookie="cusarea="+location;
// To test the default location output in browser console dev tools
console.log('Selected Area: '+location);
// Get the live value when selected
$('form.checkout').on('change', '#billing_myfield5', function(){
location = $('#billing_myfield5 option:selected').html();
document.cookie="cusarea="+location;
$('body').trigger('update_checkout');
// To test the selected location output in browser console dev tools
console.log('Selected Area: '+location);
});
})(jQuery);
</script>
<?php
}
add_action('woocommerce_cart_calculate_fees', 'distance_shipping_fee', 10, 1);
function distance_shipping_fee($wc_cart){
if (is_admin() && ! defined('DOING_AJAX')) return;
if(empty($_COOKIE ['cusarea'])) return; // Waiting for the selected area (cookie)
else $cookie = $_COOKIE ['cusarea'];
// Encoding the customer's location for Google API
$customer_area = rawurlencode($cookie);
// I am getting first item of the cart
foreach($wc_cart->get_cart() as $cart_item){
$product_id = $cart_item['product_id'];
break;
}
// Get the vendor's id and location
$vendor_id = get_post_field('post_author', $product_id);
$vendor_location = get_user_meta($vendor_id, 'billing_city', true);
// Setting Google API URL ##
$gapi_key = "MY_API_KEY"; // Set HERE your google api key
$shippingurl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$vendor_location";
$shippingurl .= "&destinations=$customer_area&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'];
// Getting the integers from the string
$distance = preg_replace("/[^0-9\.]/", '', $dist);
if($distance > 0){
$customshipcost = $distance;
// Displaying the selected location in the fee label
$wc_cart->add_fee("Distance Delivery fee ($cookie)", $customshipcost , true);
}
}
代码放在您的活动子主题(或主题)的function.php文件或也以任何插件文件。
所有代码都在Woocommerce 3+上测试过并且可以正常工作。
这将解决您的coockie和会话问题
太谢谢你了。这很棒!我真的很感谢你付出的努力使它工作:) – MAD
最近更新woocommerce后,这段代码有问题。你能帮忙吗?敲打你的Skype。提前致谢。 – MAD