Aller au contenu

Articles pour la catégorie ‘Tutoriels’

22
May

Afficher une image secondaire au survol des produits sous PrestaShop

Faire apparaitre une deuxième photo de votre produit lorsque le pointeur de la souris de vos clients survol les images de vos produits sur les pages catégories peut-être vraiment utile et augmente réellement l’ergonomie de votre site et peut également accroitre le taux de conversion.

Prestashop ne propose pas cette fonctionnalité c’est pourquoi je vais vous décrire la manipulation de manière la plus simple possible.

La première étape consiste à rajouter une variable à vos objets produit qui contiendra les informations de la deuxième image que nous allons afficher au survol, pour cela il faudra modifier la fonction getProductProperties() en lui rajoutant cette ligne code juste après la ligne 3773 :

$row['id_image2'] = Category::getProductsImgSupp((int)$row['id_product']);

avant :

$row['id_image'] = Product::defineProductImage($row, $id_lang);

après :

$row['id_image'] = Product::defineProductImage($row, $id_lang);
$row['id_image2'] = Category::getProductsImgSupp((int)$row['id_product']);

Dans cette ligne de code, je fais appel à une fonction customisée que j’ai créé dans la classe Category, vous allez également devoir la rajouter, la voici :

public function getProductsImgSupp($product_id)
	{
			$sql = '
			SELECT id_image, id_product from `'._DB_PREFIX_.'image`
			WHERE id_product="'.$product_id.'"
			ORDER BY `position` ASC
			LIMIT 1,1
			';
			$result = Db::getInstance()->ExecuteS($sql);
			return $result[0]['id_product'].'-'.$result[0]['id_image'];
	}

Cette fonction récupère la deuxième image d’un produit dans l’ordre défini dans l’administration.

Nous avons déjà fait le plus gros !

Maintenant il suffit de modifier le fichier template «product-list.tpl» afin de rajouter l’image secondaire.

Exemple :

<img class="img_second" src="{$link->getImageLink($product.link_rewrite, $product.id_image2, 'home_default')}" alt="{$product.legend|escape:'htmlall':'UTF-8'}" {if isset($homeSize)} width="{$homeSize.width}" height="{$homeSize.height}"{/if} />

Utilisez jQuery afin d’afficher l’image secondaire au survol. Rajoutez des classes différentes à vos images 1 et 2 et utilisez la propriété CSS «display» afin d’alterner leur affichage au survol.

Pour vous aider, voici le code javascript que j’ai utilisé pour cela :

<script type="text/javascript">
	$(".product_img_link").hover(
	function () {
		$(this).find('.img_second').toggle();
		$(this).find('.img_first').toggle();
	},
	function () {
		$(this).find('.img_second').toggle();
		$(this).find('.img_first').toggle();
	}
	);
</script>
21
May

Ajouter les Rich Snippets à vos produits PrestaShop !

Vous avez sans doutes déjà remarqué sur les pages de résultats des moteurs de recherche tel que Google, des petits addons tel que le prix d’un produit, son nom, la note des client ou encore la description.

Exemple d’un produit optimisé avec les Google Rich Snippets

rich snippets google produits prestashop

Google n’est pas capable de reconnaître seul quel sont les informations qui concernent vos produits, il est donc nécessaire de lui indiquer si vous souhaitez optimiser l’affichage de vos produits dans les SERP. Votre référencement n’en sera qu’amélioré.

Je vais donc vous indiquer quel sont les éléments à ajouter dans les fichiers templates de PrestaShop pour y arriver.

Nous allons donc indiquer à Google le nom du produit, sa photo, le prix ainsi que la devise.

Commençons par encadrer les informations du produit avec un attribut spécial qui va permettre d’indiquer à Google que les informations contenues à l’intérieur de cette balise concernent un produit.

Ajouter l’attribut suivant à la balise : «primary_block»

La ligne

<div class="clearfix" id="primary_block">

devient

<div class="clearfix" id="primary_block" itemscope="" itemtype="http://schema.org/Product">

Définissez ensuite :

Le nom du produit :

<h1 itemprop="name">{$product->name|escape:'htmlall':'UTF-8'}</h1>

La devise du produit :

<div itemprop="priceCurrency" content="EUR" class="price">

Le prix du produit :

<span  itemprop="price" id="our_price_display">{convertPrice price=$productPrice}</span>

L’image du produit :

<img {if $smarty.foreach.thumbnails.first}itemprop="image"{/if} id="thumb_{$image.id_image}" src="{$link->getImageLink($product->link_rewrite, $imageIds, 'medium_default')}" alt="{$image.legend|htmlspecialchars}" height="{$mediumSize.height}" width="{$mediumSize.width}" />

La description du produit :

<div itemprop="description" id="short_description_content" class="rte align_justify">{$product->description_short}</div>

Vous pouvez maintenant tester vos Rich Snippets produit grâce au service de test fournis par google : Google Structured Data Testing Tool

20
May

Prestashop : Récupérer des produits aléatoirement

Je n’ai trouvé aucune solution sur le web à un problème pourtant très simple : Récupérer une liste d’un certain nombre de produits dans l’ensemble de la boutique PrestaShop de manière aléatoire.

Pour y arriver, la manipulation est très simple, nous allons simplement dupliquer la fonction getProducts() de la classe Category afin de supprimer quelques lignes. Donnez lui le nom que vous souhaitez, ici je l’ai appelée « getRandomShopProducts»

En effet, cette fonction permet uniquement de récupérer des produits dans une catégorie définie, nous allons donc supprimer la close WHERE de la requète SQL générée par cette fonction pour ne pas filtrer les produits par un identifiant de catégorie.

Voici le bout de code que nous supprimons (ligne 636) :

AND cp.`id_category` = '.(int)$this->id

Voici donc la fonction toute prête que vous avons créé :

public function getRandomShopProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = true, $random_number_products = 10, $check_access = true, Context $context = null)
	{
		if (!$context)
			$context = Context::getContext();
		if ($check_access && !$this->checkAccess($context->customer->id))
			return false;
 
		$front = true;
		if (!in_array($context->controller->controller_type, array('front', 'modulefront')))
			$front = false;
 
		if ($p < 1) $p = 1;
 
		if (empty($order_by))
			$order_by = 'position';
		else
			/* Fix for all modules which are now using lowercase values for 'orderBy' parameter */
			$order_by = strtolower($order_by);
 
		if (empty($order_way))
			$order_way = 'ASC';
		if ($order_by == 'id_product' || $order_by == 'date_add' || $order_by == 'date_upd')
			$order_by_prefix = 'p';
		elseif ($order_by == 'name')
			$order_by_prefix = 'pl';
		elseif ($order_by == 'manufacturer')
		{
			$order_by_prefix = 'm';
			$order_by = 'name';
		}
		elseif ($order_by == 'position')
			$order_by_prefix = 'cp';
 
		if ($order_by == 'price')
			$order_by = 'orderprice';
 
		if (!Validate::isBool($active) || !Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way))
			die (Tools::displayError());
 
		$id_supplier = (int)Tools::getValue('id_supplier');
 
		/* Return only the number of products */
		if ($get_total)
		{
			$sql = 'SELECT COUNT(cp.`id_product`) AS total
					FROM `'._DB_PREFIX_.'product` p
					'.Shop::addSqlAssociation('product', 'p').'
					LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product`
					'.
					($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
					($active ? ' AND product_shop.`active` = 1' : '').
					($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '');
			return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
		}
 
		$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, MAX(product_attribute_shop.id_product_attribute) id_product_attribute, product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity, pl.`description`, pl.`description_short`, pl.`available_now`,
					pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, MAX(image_shop.`id_image`) id_image,
					il.`legend`, m.`name` AS manufacturer_name, cl.`name` AS category_default,
					DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(),
					INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).'
						DAY)) > 0 AS new, product_shop.price AS orderprice
				FROM `'._DB_PREFIX_.'category_product` cp
				LEFT JOIN `'._DB_PREFIX_.'product` p
					ON p.`id_product` = cp.`id_product`
				'.Shop::addSqlAssociation('product', 'p').'
				LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
				ON (p.`id_product` = pa.`id_product`)
				'.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1').'
				'.Product::sqlStock('p', 'product_attribute_shop', false, $context->shop).'
				LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
					ON (product_shop.`id_category_default` = cl.`id_category`
					AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
				LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
					ON (p.`id_product` = pl.`id_product`
					AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
				LEFT JOIN `'._DB_PREFIX_.'image` i
					ON (i.`id_product` = p.`id_product`)'.
				Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
				LEFT JOIN `'._DB_PREFIX_.'image_lang` il
					ON (image_shop.`id_image` = il.`id_image`
					AND il.`id_lang` = '.(int)$id_lang.')
				LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
					ON m.`id_manufacturer` = p.`id_manufacturer`
				WHERE product_shop.`id_shop` = '.(int)$context->shop->id
					.($active ? ' AND product_shop.`active` = 1' : '')
					.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
					.($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '')
					.' GROUP BY product_shop.id_product';
 
		if ($random === true)
		{
			$sql .= ' ORDER BY RAND()';
			$sql .= ' LIMIT 0, '.(int)$random_number_products;
		}
		else
			$sql .= ' ORDER BY '.(isset($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way).'
			LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
 
		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
		if ($order_by == 'orderprice')
			Tools::orderbyPrice($result, $order_way);
 
		if (!$result)
			return array();
 
		/* Modify SQL result */
		return Product::getProductsProperties($id_lang, $result);
	}

Vous remarquez que nous avons passé la valeur du paramètre «random» à «true».
Votre fonction est prête à être utilisée, vous pouvez par exemple récupérer 10 produits de votre boutique aléatoirement de cette manière :

Category::getRandomShopProducts((int)Context::getContext()->language->id, 1, 10);

Libre à vous d’utiliser les autres paramètres de la fonction pour trier vos produits, sélectionner la page ainsi que le nombre de produits.

Manipulation exécutée sous Prestashop 1.5.x mais tout à fait réalisable sur les versions précédentes.

Tips : Utilisez de préférence l’override pour rajouter vos fonctions personnalisées !