Cookies tenaces : Les effacer par la méthode forte

Certains systèmes mettent dans la mémoire du navigateur des informations. Dans mon cas, il s’agissait du panier de WooCommerce et de la cache du calcul des frais de livraison. Pour minimiser les chances qu’il soit perdu entre deux visites, il est stocké à plusieurs endroits :

Mais cette abondance de précaution peut être énervante quand vient le temps de faire le ménage. Il faut effacer ces quatre copies de l’information, sinon elle va se recopier partout et revenir à chaque chargement. Il faut aussi ajouter notre propre cookie temporaire pour ne faire l’opération qu’une fois. Voici une solution simple. Elle ne couvre peut-être pas tous les cas possibles, mais elle a fonctionné dans le mien.

JavaScript

Fonctions

// https://stackoverflow.com/a/24103596/1995518
function setCookie( name, value, days ) {
	var expires = "";

	if( days ) {
		var date = new Date();
		date.setTime(date.getTime() + (days*24*60*60*1000));
		expires = "; expires=" + date.toUTCString();
	}

	document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}

// https://stackoverflow.com/a/179514/1995518
function expireAllCookies() {
	var cookies = document.cookie.split("; ");

	for( var c = 0; c < cookies.length; c++ ) {
		var d = window.location.hostname.split(".");

		while (d.length > 0) {
			var cookieBase = encodeURIComponent(cookies[c].split(";")[0].split("=")[0]) + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' + d.join('.') + ' ;path=';
			var p = location.pathname.split('/');

			document.cookie = cookieBase + '/';

			while (p.length > 0) {
				document.cookie = cookieBase + p.join('/');
				p.pop();
			}
			d.shift();
		}
	}
}

// https://stackoverflow.com/a/5968306/1995518
function getCookie( name ) {
	var dc = document.cookie;
	var prefix = name + "=";
	var begin = dc.indexOf("; " + prefix);
	if (begin == -1) {
		begin = dc.indexOf(prefix);
		if (begin != 0) return null;
	}
	else {
		begin += 2;
		var end = document.cookie.indexOf(";", begin);
		if (end == -1) {
			end = dc.length;
		}
	}

	return decodeURI(dc.substring(begin + prefix.length, end));
}

Le script

( function() {
	// Mettez ici la date après laquelle ce code n'est plus pertinent
	var lastExpirationDate = new Date( '2020-05-05 00:00:00' );
	var now = new Date();

	if( now < lastExpirationDate && ! getCookie( 'shippingExpiredOldCookies' ) ) {
		expireAllCookies();
		window.localStorage.clear();
		window.sessionStorage.clear();
		// On ajoute le cookie qui dit qu'on a procédé à l'effacement. Valide pour 10 jours.
		setCookie( 'shippingExpiredOldCookies', 1, 10 );
	}
} ) ();

PHP

L’effacement via JavaScript ci-dessus n’est pas suffisant si le site renvoie et recrée toutes les données côté client à chaque chargement de la page. Il faut donc en plus les éliminer à la source.

// Mettez ici la date après laquelle ce code n'est plus pertinent
$no_need_anymore = strtotime( '2020-05-05 00:00:00' );
$now = time();
$past = $now - 3600;

if( empty( $_COOKIE['shippingExpiredOldCookies'] ) && $now < $no_need_anymore ) {

	// Effacement des cookies qu'on ne veut plus
	setcookie( 'woocommerce_cart_hash', 0, $past );
	setcookie( 'woocommerce_items_in_cart', 0, $past );
	// Je vide absolument toute la session pour me simplifier la vie, car dans mon cas, il ne pouvait pas y avoir d'effets secondaires majeurs cette fois. Si c'est plus pertinent, on peut aussi vider uniquement les variables de session nécessaires.
	session_unset();
	// On ajoute le cookie qui dit qu'on a procédé à l'effacement. Valide jusqu'à la date de fin spécifiée.
	setcookie( 'shippingExpiredOldCookies', 1, $no_need_anymore );
}