2017-08-28 69 views
1

所以我試圖找到一個解決方案,通過他們的位置和賣家的位置之間的距離爲我的客戶收費,但找不到合適的東西。我發現很少有使用Google API在倉庫和貨運地點之間做類似工作的插件,但它們只處理一個倉庫。我實際上有幾個供應商在不同的地點有倉庫。根據賣家和客戶之間的距離的運費

我使用woocommerce和wc供應商插件。

僅供參考...我已經設置了一個meta字段,使用Google Api收集供應商的經緯度。

//一個例子://

供應商1 - 位置1供應商2 - 位置2

一位顧客從地方供應商1.客戶的位置順序是 位置A. API將計算購物車中物品的 供應商的位置,這是位置1,和客戶的位置,之間的距離,這是 位置A.

Check the cart item's Vendor 
Get the location of Vendor 

    If Location 1 to Location A = 3KM, 
    Shipping Charge is 50; 
    If Location 1 to Location A <= 5 KM, 
    Shipping Charge is 100; 
    Else 
    Shipping Charge is 150; 

//示例結束//

N.B.我只是沒有找到任何插件遠程運輸費用與WC供應商插件很好。即使你設法給我任何做這項工作的任何插件的鏈接,這也是值得讚賞的。


所以,@loictheaztec提供了一個解決方案如下。我已經根據他的代碼寫了一段代碼。不幸的是,它不適合我。

add_filter('woocommerce_package_rates', 'distance_shipping_calculated_surcharge', 100, 2); 
    function distance_shipping_calculated_surcharge($rates, $package) { 


    $shippingurl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=VENDOR_LOCATION&destinations=CUSTOMER_LOCATION&key=MY_API_KEY"; 

    //fetch 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']; 
    } 

    // Get only number from string 
    $distance= filter_var ($dist, FILTER_SANITIZE_NUMBER_INT); 

    // Distance example 
    //$distance = 3.5; //(in KM) 

    if($distance > 5) 
     $cost_operator = 3; // (3 * 50 = 150) 
    elseif($distance > 3 && $distance <= 5) 
     $cost_operator = 2; // (2 * 50 = 100) 
    else 
     $cost_operator = 1; // (1 * 50 = 50) 

    // Iterating through each shipping rate 
    foreach($rates as $rate_key => $rate_values){ 
     $method_id = $rate_values->method_id; 
     $rate_id = $rate_values->id; 

     // Targeting "Flat Rate" shipping method 
     if ('flat_rate' === $rate_values->method_id) { 
      // Set the new calculated rate cost 
      $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cost_operator, 2); 
      // Taxes rate cost (if enabled) 
      foreach ($rates[$rate_id]->taxes as $key => $tax){ 
       if($rates[$rate_id]->taxes[$key] > 0){ // set the new tax cost 
        $rates[$rate_id]->taxes[$key] = number_format($rates[$rate_id]->taxes[$key] * $cost_operator, 2); 
       } 
      } 
     } 
    } 
    return $rates; 
} 

回答

0

假設您擁有供應商與客戶之間的公里距離。

add_action('woocommerce_flat_rate_shipping_add_rate','add_another_custom_flat_rate', 10, 2); 

function add_another_custom_flat_rate($method, $rate) { 
$new_rate   = $rate; 

/*let the distance is = $dis; */ 
if($dis==3){ 
$new_rate['cost'] = 50; // Update the cost to 50 
} else if($dis<=5){ 
$new_rate['cost'] = 100; // Update the cost to 100 
} else { 
$new_rate['cost'] = 150; // Update the cost to 150 
} 


$method->add_rate($new_rate); 
} 
1
  1. 首先你會爲每個航運區一個「固定費率」航運法的50成本(您可以啓用稅或沒有)。
  2. 您應該添加一個自定義函數,該函數掛鉤了woocommerce_package_rates過濾器掛鉤。
  3. 在這個自定義函數中,您將不得不設置您的API代碼來獲得客戶和供應商之間的距離。

這裏是代碼:

add_filter('woocommerce_package_rates', 'distance_shipping_calculated_surcharge', 100, 2); 
function distance_shipping_calculated_surcharge($rates, $package) { 

    ## HERE set your API code to get the distance ## 

    // Distance example 
    $distance = 3.5; //(in KM) 

    if($distance > 5) 
     $cost_operator = 3; // (3 * 50 = 150) 
    elseif($distance > 3 && $distance <= 5) 
     $cost_operator = 2; // (2 * 50 = 100) 
    else 
     $cost_operator = 1; // (1 * 50 = 50) 

    // Iterating through each shipping rate 
    foreach($rates as $rate_key => $rate_values){ 
     $method_id = $rate_values->method_id; 
     $rate_id = $rate_values->id; 

     // Targeting "Flat Rate" shipping method 
     if ('flat_rate' === $rate_values->method_id) { 
      // Set the new calculated rate cost 
      $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cost_operator, 2); 
      // Taxes rate cost (if enabled) 
      foreach ($rates[$rate_id]->taxes as $key => $tax){ 
       if($rates[$rate_id]->taxes[$key] > 0){ // set the new tax cost 
        $rates[$rate_id]->taxes[$key] = number_format($rates[$rate_id]->taxes[$key] * $cost_operator, 2); 
       } 
      } 
     } 
    } 
    return $rates; 
} 

此代碼放在你的活躍兒童主題(或主題)的function.php文件或也以任何插件文件。

經過測試和工作。

有時是必要的刷新航運緩存:
1)首先你的車是空的。
2)代碼已經保存在你的function.php文件中。
3)進入運輸區域,並禁用一個「統一費率」(例如)和「保存」。然後重新啓用「統一費率」和「保存」。 你完成了。

+0

嗨@loictheaztec,謝謝您的配合。不幸的是,它不適合我。請看下面的答案,因爲這裏寫的太長。 – MAD

+0

你能再看看這個問題嗎?我在問題的底部添加了幾行,謝謝 – MAD