2017-08-28 2 views
1

Donc j'essayais de trouver une solution de facturer mes clients par la distance entre leurs emplacements et les emplacements des vendeurs, mais je n'ai rien trouvé de convenable. J'ai trouvé quelques plugins qui font un travail similaire, comme les frais d'expédition différents entre l'entrepôt et l'emplacement d'expédition à l'aide de l'API Google, mais ils ne traitent qu'avec un seul emplacement spécifique comme entrepôt. J'ai plusieurs fournisseurs qui ont des entrepôts dans des endroits différents. J'utilise woocommerce et wc vendor plugin.Coût d'expédition basé sur la distance entre le vendeur et le client

FYI ..., J'ai défini un champ Meta qui recueille la latitude et la longitude du fournisseur à l'aide de Google Api.

// Un exemple: //

Fournisseur 1 - Emplacement 1 vendeur 2 - Emplacement 2

Un client passe commande de l'emplacement du fournisseur 1. Le client est Localisation API calcule A. la distance entre l'emplacement de de l'élément de panier vendeur, qui est l'emplacement 1 et l'emplacement du client, qui est emplacement 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; 

// Exemple terminé //

N.B. Je ne trouve aucun plugin pour les frais d'expédition à distance qui fonctionne bien avec le plugin WC Vendor. Même si vous parvenez à me donner un lien de n'importe quel plugin qui fait ce travail, ce serait apprécié aussi.


Ainsi, @loictheaztec a fourni une solution ci-dessous. J'ai écrit un morceau de code basé sur ses codes. Malheureusement, ça ne marche pas pour moi.

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; 
} 

Répondre

0

En supposant que vous avez la distance en Km entre le fournisseur et le client.

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. D'abord, vous établira un « taux forfaitaire » méthode de livraison pour chaque zone de livraison avec un coût de 50 (vous pouvez activer l'impôt ou non).
  2. Vous devez ajouter une fonction personnalisée accrochée au crochet woocommerce_package_rates.
  3. Dans cette fonction personnalisée, vous devrez définir votre code API pour obtenir la distance entre le client et le fournisseur.

Voici ce code:

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; 
} 

Ce code va dans le fichier function.php de votre thème enfant actif (ou le thème) ou encore dans un fichier de plug-in.

Testé et fonctionne.

Parfois est nécessaire pour rafraîchir les caches d'expédition:
1) Tout d'abord votre panier est vide.
2) Le code est déjà enregistré dans votre fichier function.php.
3) Allez dans une zone d'expédition et désactiver un "taux forfaitaire" (par exemple) et "enregistrer". Puis réactivez ce "taux forfaitaire" et "enregistrer". Vous avez terminé.

+0

Bonjour @loictheaztec, Nous vous remercions de votre coopération. Malheureusement, ça ne marche pas pour moi. S'il vous plaît voir la réponse ci-dessous car il est trop long d'écrire ici. – MAD

+0

Pouvez-vous jeter un oeil à la question à nouveau? J'ai ajouté quelques lignes au bas de la question. – MAD