Une date de livraison comme Amazon sur WooCommerce

Livraison Amazon : le diktat du temps

Snippet time !

Aujourd’hui j’ai décidé de vous mettre à disposition un petit script qui vous permettra d’afficher la date de livraison sur vos fiches produits WooCommerce à la façon d’Amazon.

Cette fonctionnalité existe via de nombreux plugins… Cependant, je trouve qu’elle ne fonctionne pas toujours très bien… En effet, la plupart des développeurs ne raisonnent pas exactement la logistique d’expédition comme elle se passe dans le monde réel.

Je vous laisse le choix dans la date

Ainsi le calcul des délais doit être fait en plusieurs fois et non en une seule ! Je m’explique : il ne s’agit pas d’ajouter des jours pour ajouter des jours, mais de bien comprendre la logique des e-commerçants et des livreurs.

En gros, les e-commerçants reçoivent la commande, celle-ci est préparée, puis déposée chez le transporteur, qui a un temps de traitement, puis d’acheminement, puis de livraison. Ainsi pour avoir un calcul précis il faut tenir compte d’un maximum d’étapes. Durant chacune de ces étapes peuvent survenir des jours fériés, le jour de transfert à la plateforme d’expédition peut rajouter une journée ou pas en fonction de l’heure, il peut y avoir des samedi et dimanche qui doivent être ajoutés au délai de transport ou encore le jour de livraison peut tomber un jour férié ou un dimanche… Bref, ce n’est pas juste une addition à partir de la date de commande !

Le calcul doit donc être fait en cascade et non en totalité à partir de la date de commande. C’est pour cela que je vous mets à disposition le script suivant :

/*******************************************************/
/***** Date de livraison estimée sur fiche produit *****/
/*******************************************************/

function mw_add_delivery_date_prod() {
	
	//Si en stock, on affiche la phrase
	
	$prod_id = get_the_id();
	$product = wc_get_product( $prod_id );
	$instock_status = $product->get_stock_status();
		
		if (is_product() && $instock_status == 'instock') {

	//Test samedi - renvoie true/false
function mw_isFriday($date) {
       return (date('N', $date) == 5);
}
	
	//Test samedi - renvoie true/false
function mw_isSaturday($date) {
       return (date('N', $date) == 6);
}
	//Test dimanche - renvoie true/false
function mw_isSunday($date) {
       return (date('N', $date) == 7);
}

	//Test heure - On fixe l'heure limite avant laquelle le colis est traité dans la journée
function mw_isDeliveryTime($date) {
		//Heure d'expédition
		$deliverylimit = 10;
	return (date('H', $date) >= $deliverylimit);
}

//Variables utiles

	//Maintenant sur le fuseau horaire de Paris
	$now = time(new DateTime('now', new DateTimeZone('Europe/Paris')));
	$today = time(new DateTime('now', new DateTimeZone('Europe/Paris')));

	//Durée de livraison
	$shortdeliv = '2';

	// Liste des jours fériés (à adapter)
	$holidays = array (
					   '14-07-2018',
					   '15-08-2018',
					   '01-11-2018',
					   '25-12-2018',
					   '01-01-2019',
					   '22-04-2019',
					   '01-05-2019',
					   '08-05-2019',
					   '30-05-2019',
					   '10-06-2019',
					   '15-08-2019',
					   '01-11-2019',
					   '11-11-2019',
					   '25-12-2019',
					   '01-01-2020'
					   );
	
	//On fait tourner le bouzin !
	
	// On teste l'heure de commande
	if (mw_isDeliveryTime($now)) {
		$now = strtotime('+ 1 day', $now);
	}
	
	//On teste les jours où la poste ne travaille pas
	while ( (in_array( date('d-m-Y' , $now) , $holidays)) || (mw_isSunday($now)) || (mw_isSaturday($now)) ) {
		$now = strtotime('+ 1 day', $now);
	}
	
	//On ajoute le délai de livraison
	$i = 0;
	
	while( $i < $shortdeliv ) {
		if ( (in_array( date('d-m-Y' , $now) , $holidays)) || (mw_isSunday($now)) ) {
		$now = strtotime('+ 1 day', $now);
		
	} else {
		$now = strtotime('+ 1 day' , $now);
		$i++;
	}
	}
	
	//On teste le jour de livraison
	while ( (in_array( date('d-m-Y' , $now) , $holidays)) || (mw_isSunday($now)) ) {
		$now = strtotime('+ 1 day', $now);
	}
	
	//On met la date en français
	setlocale(LC_TIME, 'fr_FR.utf8','fra');
	$delivday = strftime('%A %d %B', $now); //date('l d F', $now);		

/*à dé-commenter et adapter si on utilise un système de traduction - ici GTranslate*/
//$current_lang = isset($_SERVER['HTTP_X_GT_LANG']) ? $_SERVER['HTTP_X_GT_LANG'] : '';
   //if( $current_lang == ''  ) {
	   if ( (mw_isFriday($today)) || (mw_isSaturday($today)) || (mw_isSunday($today))) {
			echo '';
	   } else {
		   echo '

Voulez-vous le faire livrer le <strong>' . $delivday . '</strong> ? Choisissez la Livraison Colissimo au cours de votre commande. <a href="https://www.monsite.com/informations-livraison/" target=_blank>En savoir +</a>

';
		   }
			//}
		}
}

//On ajoute notre texte sur la fiche produit
add_action('woocommerce_single_product_summary' , 'mw_add_delivery_date_prod', 15);
*/

Un peu de mise en forme

Véronique et Davina : Reines de la mise en forme

Pensez à modifier votre CSS pour que le texte apparaisse comme vous le souhaitez via la classe .mwdelivdate :

.mwdelivdate {
font-size: small;
color: forestgreen;
}

Normalement, si vous avez paramétré et intégré le script au fichier functions.php et le CSS dans votre thème, cela devrait faire le job !

Enjoy !

Epingle-moi !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *