Jump to content

Panier vide aléatoires / identification impossible - SOLUTION


Recommended Posts

Bonjour,

 

Je suis en galère depuis 2 semaines sur un problème de panier qui se vide de manière aléatoire sur certains ordis mes pas d'autres (après clic sur Ajouter au panier, le visiteur a un récapitulatif panier vide).

 

Après toutes ces galères je pense avoir fait le tour du problème.

 

Il y a 3 cas :

1) Vous êtes sous mutualisé OVH : désactiver le Géocache

2) Vous avez une version Prestashop < 1.5.5 : voir ce bugtracker http://forge.prestashop.com/browse/PSCFV-5698

3) Aucun problème apparent...

 

La plus chiante c'est la dernière. Le problème n'est pas reproduit par tous les ordis, est totalement aléatoire. Parfois on peut s'identifier mais pas faire de panier et parfois c'est l'inverse.

 

La cause est la suivante : soit parce que vous avez ajouter après les www., soit parce que vous utilisez plusieurs sous-domaines ou parce qu'un jour pour une raison bizarre, un visiteur est arrivé à utilisé votre site pendant un bref instant sans les www., un cookie s'est créé sur votre domaine sans les www.

 

Concrètement sur le navigateur de celui-ci, il y a deux cookies, un sur www.mondomaine.com qui est le bon et un sur mondomaine.com qui est obsolète et le navigateur s'amuse à prendre celui-là des fois. Maintenant allez dire à tous vos anciens visiteurs d'aller dans les configurations de leur navigateur et de vider les cookies.

 

Il faut forcer la suppression des cookies obsolètes. Par cela allez dans classes/shop/Shop.php, trouvez la fonction public static function initialize() et mettre ce code à la fin du premier if (juste avant

}
 if ((!$id_shop && defined('_PS_ADMIN_DIR_')) || Tools::isPHPCLI())

)

			foreach($_COOKIE as $nomCookie => $valeurCookie)
			{
				setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),false);
				setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),true);
				//unset($_COOKIE[$nomCookie]);
			}

Cela va supprimer les cookies des domaines sans www.

 

Le code final de la classe devrait ressembler à ça :

		// Find current shop from URL
		if (!($id_shop = Tools::getValue('id_shop')) || defined('_PS_ADMIN_DIR_'))
		{
			$host = pSQL(Tools::getHttpHost());
			$sql = 'SELECT s.id_shop, CONCAT(su.physical_uri, su.virtual_uri) AS uri, su.domain, su.main
					FROM '._DB_PREFIX_.'shop_url su
					LEFT JOIN '._DB_PREFIX_.'shop s ON (s.id_shop = su.id_shop)
					WHERE (su.domain = \''.$host.'\' OR su.domain_ssl = \''.$host.'\')
						AND s.active = 1
						AND s.deleted = 0
					ORDER BY LENGTH(CONCAT(su.physical_uri, su.virtual_uri)) DESC';

			$id_shop = '';
			$found_uri = '';
			$request_uri = rawurldecode($_SERVER['REQUEST_URI']);
			$is_main_uri = false;
			if ($results = Db::getInstance()->executeS($sql))
			{
				foreach ($results as $row)
				{
					// An URL matching current shop was found
					if (preg_match('#^'.preg_quote($row['uri'], '#').'#i', $request_uri))
					{
						$id_shop = $row['id_shop'];
						$found_uri = $row['uri'];
						if ($row['main'])
							$is_main_uri = true;
						break;
					}
				}
			}

			// If an URL was found but is not the main URL, redirect to main URL
			if ($id_shop && !$is_main_uri)
			{
				foreach ($results as $row)
				{
					if ($row['id_shop'] == $id_shop && $row['main'])
					{
						// extract url parameters
						$request_uri = substr($request_uri, strlen($found_uri));
						$url = str_replace('//', '/', $row['domain'].$row['uri'].$request_uri);
						header('HTTP/1.1 301 Moved Permanently');
						header('Cache-Control: no-cache');
						header('location: http://'.$url);
						exit;
					}
				}
			}
			
			
			foreach($_COOKIE as $nomCookie => $valeurCookie)
			{
				setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),false);
				setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),true);
				//unset($_COOKIE[$nomCookie]);
			}
			
		}

		if ((!$id_shop && defined('_PS_ADMIN_DIR_')) || Tools::isPHPCLI())
		{
			// If in admin, we can access to the shop without right URL
			if ((!$id_shop && Tools::isPHPCLI()) || defined('_PS_ADMIN_DIR_'))
				$id_shop = (int)Configuration::get('PS_SHOP_DEFAULT');

			$shop = new Shop((int)$id_shop);
			if (!Validate::isLoadedObject($shop))
				$shop = new Shop((int)Configuration::get('PS_SHOP_DEFAULT'));

			$shop->physical_uri = preg_replace('#/+#', '/', str_replace('\\', '/', dirname(dirname($_SERVER['SCRIPT_NAME']))).'/');
			$shop->virtual_uri = '';
  • Like 1
Link to comment
Share on other sites

  • 4 months later...

Dans /tools/geoip j'ai installé le fichier GeoLiteCity.dat

et depuis tout fonctionne :)

 

Dans le back-office de Prestashop (1.6.0.14) -> Localisation ce fichier est proposé au téléchargement et la procédure d'installation est indiquée.

 

Bonne continuation à tous

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...