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;
}
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
Pouvez-vous jeter un oeil à la question à nouveau? J'ai ajouté quelques lignes au bas de la question. – MAD