通过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和会话问题

+1

太谢谢你了。这很棒!我真的很感谢你付出的努力使它工作:) – MAD

+0

最近更新woocommerce后,这段代码有问题。你能帮忙吗?敲打你的Skype。提前致谢。 – MAD