Home Calculated distance shipping cart fee via Google API in WooCommerce
Reply: 0

Calculated distance shipping cart fee via Google API in WooCommerce

user3587 Published in June 19, 2018, 4:12 pm

So, I have written a piece of code after getting some help from SO and internet. I want to add a fees to the cart by calculating the distance between the vendor's location (billing_city) and customer's area via Google Maps API Distance-Matrix. Here, I use a dropdown after billing form to get the area of customer.

I am having problem of getting the value from cookies and pass the variable to next function. FYKI, I have inserted this code into my child theme functions.

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']; 

    //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( $ ) {
                var location = $('#billing_myfield5 option:selected').text();

    //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['dist'] = $dist_ance;

So, now I should have a value in $_SESSION['dist']and I should be able to pass it to another function in same page. Here's the code I am using to calculate the cart fees.

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){

    if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {

        $customshipcost = $dist_ance;
        if ( is_admin() && ! defined ( 'DOING_AJAX' ))
            WC()->cart->add_fee('Distance Delivery Charge', $customshipcost , true);

Well, I am having two problems actually. Any help would be really appreciated.

  • Sometimes I get the value from cookie, sometimes I don't. I use echo to check whether it's giving me the value or not.
  • The session is not responding. I get a '0' as fees in my cart.

FYKI, I am just trying to show only numerical distance as fees in cart right now.

You need to login account before you can post.

About| Privacy statement| Terms of Service| Advertising| Contact us| Help| Sitemap|
Processed in 0.390012 second(s) , Gzip On .

© 2016 Powered by mzan.com design MATCHINFO