Les meilleures ventes Prestashop avec un peu de fun

Le module meilleures ventes de Prestashop… vous connaissez ? Oui celui qui affiche les produits les plus vendus, il s’affiche en principe dans un bloc à gauche ou à droite… on va lui donner un ptit coup de jeune avec 3 fois rien.

Une amie m’a fait une suggestion
Elle m’a expliqué qu’elle avait ce module meilleures ventes qui était activé sur sa boutique, mais que c’était un peu figé… car les meilleures ventes sont toujours présentées de manière similaire. Du coup si on ne fait pas de nouvelles ventes très vite… on se retrouve toujours avec les mêmes produits dans le bloc de présentation (et ça blase le client… et ça donne l’impression d’une offre limitée).

Comment on fait ?
Bon on va faire un truc pire simple… on va juste changer l’ordre des produits en lui faisant trier par ordre aléatoire les résultats trouvés… Quoi juste ça ? Oui mais tu sais… les modifications les plus simples sont souvent les meilleures (si si c’est de moi cette phrase).

On y va ! Goooo !
Bon pour ceux qui veulent comprendre, on va en fait écraser le comportement de la classe « ProductSale.php » et appliquer notre nouveau traitement. Pour cela il faut créer un nouveau fichier qui s’appelle « ProductSale.php » dans le répertoire « /override/classes/ ». Cette modification est valable pour Prestashop du type 1.4 (hé oui c’est la vie).

Voici ce que doit comprendre ce fichier :

<?php

class ProductSale extends ProductSaleCore
{

	/*
	** Get required informations on best sales products
	**
	** @param integer $id_lang Language id
	** @param integer $pageNumber Start from (optional)
	** @param integer $nbProducts Number of products to return (optional)
	** @return array keys : id_product, link_rewrite, name, id_image, legend, sales, ean13, upc, link
	*/
	public static function getBestSalesLight($id_lang, $pageNumber = 0, $nbProducts = 10)
	{
	 	global $link;

		if ($pageNumber < 0) $pageNumber = 0;
		if ($nbProducts < 1) $nbProducts = 10;

		$groups = FrontController::getCurrentCustomerGroups();
		$sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');

		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
		SELECT p.id_product, pl.`link_rewrite`, pl.`name`, pl.`description_short`, i.`id_image`, il.`legend`, ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category
		FROM `'._DB_PREFIX_.'product_sale` ps
		LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`
		LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.')
		LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
		LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
		LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = p.`id_category_default` AND cl.`id_lang` = '.(int)$id_lang.')
		WHERE p.`active` = 1
		AND p.`id_product` IN (
			SELECT cp.`id_product`
			FROM `'._DB_PREFIX_.'category_group` cg
			LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
			WHERE cg.`id_group` '.$sqlGroups.'
		)
		ORDER BY RAND()
		LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts));

		if (!$result)
			return false;

		foreach ($result AS &$row)
		{
		 	$row['link'] = $link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']);
		 	$row['id_image'] = Product::defineProductImage($row, $id_lang);
		}
		return $result;
	}
}

J’ai changé presque rien… dans le fichier original on trouve normalement cette ligne (vers la ligne 141)

ORDER BY sales DESC

Je l’ai juste changée avec la fonction aléatoire… oui c’est tout (pour ceux qui veulent, vous pouvez télécharger le fichier directement).

ORDER BY RAND()

Maintenant si on affiche le shop une 1ère fois on a le résultat suivant.

Si on ré-affiche la page on obtient un résultat différent (bon y’a toujours l’ipod… j’ai que 3 produits dans les meilleures ventes).



Conseil pour les pauvres qui n’ont pas de meilleurs ventes

Si tes meilleures ventes sont vides… et bien tu peux créer toi-même des commandes avec ton compte client « factice » et ensuite mettre ces commandes en statut payé… du coup tu auras des produits dans le bloc. C’est la méthode du pauvre… qui te rendra d’apparence « riche » aux yeux de l’internaute… (ahah).

Bilan
Quand je suis intéressé par une gamme de produits j’aime bien regarder les meilleurs ventes… car je me dis que la plupart des internautes ont forcément achetés les meilleurs produits de la boutique. C’est bien là qu’il y a un enjeu, vous pouvez tout à fait tricher sur ce module en le gonflant avec une fausse commande qui englobe tous vos produits invendus par exemple (et forcément inciter des clients à les acheter). Bon, si on revient au but initial, la priorité c’est de proposer une interface dynamique et vivante à vos clients… avec cette astuce ça va faire tourner un max les produits sur votre boutique !

Notez mon billet, Google va adorer :
1 étoiles - J'aime pas !2 étoiles - Bof !3 étoiles - Bien !4 étoiles - Très bien !5 étoiles - Génial ! (Soyez le premier à noter ce billet)
Loading...

20 commentaires sur “Les meilleures ventes Prestashop avec un peu de fun”

    1. C’est basé sur les articles contenus dans les commandes ayant un statut « payé »… Si vous avez des produits que vous avez vendus en plus grandes quantités, ils devraient s’afficher.

  1. Bonjour,

    Désolé mais ce code est compatible uniquement avec la version 1.4 de Prestashop… sous la version 1.5 je pense qu’il faudra faire une révision du code…

    J’essaierai à l’occasion d’actualiser ce billet pour la nouvelle version de Prestashop.

    A bientôt !

  2. merci de ton astuce. Question subsidiaire. J’offre un produit en cadeau sous certaines conditions. Comment faire pour qu’il ne considère pas un cadeau (rège panier) comme une vente ?

    1. Il faudrait modifier toujours la même fonction et exclure les produits avec la requête en utilisant par exemple « NOT IN » pour exclure des ID ou les références produits qui ne devraient pas être affichés.

      On peut aussi mettre une conditions dans la boucle du TPL… pour faire l’exclusion, c’est au choix !

    1. Toujours pas… il y’aurait tellement de billets à mettre à jour… faut que je reprenne le contenu complètement au travers d’un nouveau billet.

      Est-ce que je le ferais ? Je sais pas encore… peut-être sur des thématiques très demandées.

    1. Bonjour, je viens de rester sur 1.5 et cette modification fonctionne !
      par contre j’aimerais l’appliquer seulement aux meilleurs ventes actives des 30 derniers jours. Quoi modifier pour que cela fonctionne s’il vous plait ?

        1. Bonjour et merci beaucoup pour ta réponse qui m’a permise d’avancer. J’ai ajouté une ligne de code :

          AND product_shop.`date_add`< DATE(NOW() - INTERVAL 30 DAY)
          

          à la fin de mon fichier ProductSale.php, mais le résultat n’affiche pas les meilleurs ventes des 30 derniers jours, aurez tu une idée s’il te plait ? :

          
          				WHERE product_shop.`active` = 1
          					AND product_shop.`date_add`executeS($sql))
          			return false;
          
          		foreach ($result as &amp;$row)
          		{
          		 	$row['link'] = $context->link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']);
          		 	$row['id_image'] = Product::defineProductImage($row, $id_lang);
          		}
          		return $result;
          	}
           }
           ?>
          
          1. Hello,

            Désolé, mais sans tester sur un cas réel difficile de dire où pourrait se situer le problème.

            Peut-être pour un prochain tuto…

            A bientôt !

  3. Bonjour,

    Je rencontre un problème avec mon site web e commerce.

    Visiblement les meilleures ventes sur ma page d’accueil son figées et c’est pareil pour les promotions, elles ne changent plus … Est ce que quelqu’un peu m’aider je suis novice totalement.

    Ma version de prestashop est 1.5.6.2

    Merci beaucoup

    Maria

    1. Bonjour,

      A mon avis il faut chercher dans le sens d’une erreur Javascript, car il est possible que le blocage vienne de là.

      Pour cela il faudrait effectuer un contrôle des erreurs Javascript via la console de Firebug.

      Bonne journée !

Laisser un commentaire

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