Comme promis, voici un billet plus ou moins utiles notamment si vous vous intéressé de près à votre taux de conversion et à la performance de votre boutique PrestaShop.
PrestaShop, bien pour le référencement ?
Oui, PrestaShop est déjà doté de bonnes bases et d’outils / fonctionnalités efficace quand il s’agit de parler “référencement“. On peut notamment relever : la génération auto des balises alt des images produits avec la possibilité de personnaliser celles-ci, la possibilité d’indexer les déclinaisons produits avec des urls réécrites, la gestion d’une tâche cron pour mettre à jour le sitemap…
Le bilan est donc positif pour une solution e-commerce open-source, on ne part donc pas de zéro et je dirai même avec un bon avantage et d’autant plus si vous rédigez de belles et pertinentes descriptions produit. Le contenu est roi !
Comment améliorer le référencement de ma boutique PrestaShop via les balises title ?
C’est la question qu’on se pose aujourd’hui et voici un élément de réponse plutôt efficace et qui ne nécessite pas 10 jours de développement, ne pas attendre pour le mettre en place 🙂
Constat : peut mieux faire
La balise meta title – c’est le titre de la page affiché dans le cadre haut de votre navigateur – est très importante pour la visibilité de votre boutique autant pour les moteurs de recherche que pour les internautes qui vont lire les résultats de recherche. Chaque balise meta title doit être unique dans votre boutique et l’affichage est limité à 70 caractères donc autant exploiter au maximum cette précieuse place en l’optimisant.
PrestaShop en natif affiche les balises title de la sorte : [nom_du_produit] – [nom_du_site]
[box type=”error” size=”large”]< title > Mon produit – Ma boutique PrestaShop < /title >[/box]
Le nom du site n’est pas forcément pertinent d’autant qu’on aura sûrement besoin de la place pour le nom du produit
Solution : on vire le nom de la boutique !
On vient de voir que le nom de la boutique rallonge la balise meta title or on a besoin de la place pour garder une longueur de titre optimale.
[box type=”info” size=”large”]on va donc modifier la class Meta.php qui régie la construction des balises metas de PrestaShop.[/box]
On ouvre le fichier www/override/classes/Meta.php et on y colle ce bout de code :
[code]
<?php
// Optimisation des meta titles en supprimant la concaténation du nom de la boutique si le meta title est défini
class Meta extends MetaCore
{
/**
* Get meta tags for a given page
*
* @since 1.5.0
* @param int $id_lang
* @param string $page_name
* @return array Meta tags
*/
public static function getHomeMetas($id_lang, $page_name)
{
$metas = Meta::getMetaByPage($page_name, $id_lang);
$ret[‘meta_title’] = (isset($metas[‘title’]) && $metas[‘title’]) ? $metas[‘title’] : Configuration::get(‘PS_SHOP_NAME’);
$ret[‘meta_description’] = (isset($metas[‘description’]) && $metas[‘description’]) ? $metas[‘description’] : ”;
$ret[‘meta_keywords’] = (isset($metas[‘keywords’]) && $metas[‘keywords’]) ? $metas[‘keywords’] : ”;
return $ret;
}
/**
* Get category meta tags
*
* @since 1.5.0
* @param int $id_category
* @param int $id_lang
* @param string $page_name
* @return array
*/
public static function getCategoryMetas($id_category, $id_lang, $page_name, $title = ”)
{
if (!empty($title))
$title = ‘ – ‘.$title;
$page_number = (int)Tools::getValue(‘p’);
$sql = ‘SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description`
FROM `’._DB_PREFIX_.’category_lang` cl
WHERE cl.`id_lang` = ‘.(int)$id_lang.’
AND cl.`id_category` = ‘.(int)$id_category.Shop::addSqlRestrictionOnLang(‘cl’);
if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
{
if (empty($row[‘meta_description’]))
$row[‘meta_description’] = strip_tags($row[‘description’]);
// Paginate title
if (!empty($row[‘meta_title’]))
$row[‘meta_title’] = $title.$row[‘meta_title’].(!empty($page_number) ? ‘ (‘.$page_number.’)’ : ”);
else
$row[‘meta_title’] = $row[‘name’].(!empty($page_number) ? ‘ (‘.$page_number.’)’ : ”);
if (!empty($title))
$row[‘meta_title’] = $title.(!empty($page_number) ? ‘ (‘.$page_number.’)’ : ”);
return Meta::completeMetaTags($row, $row[‘name’]);
}
return Meta::getHomeMetas($id_lang, $page_name);
}
/**
* Get manufacturer meta tags
*
* @since 1.5.0
* @param int $id_manufacturer
* @param int $id_lang
* @param string $page_name
* @return array
*/
public static function getManufacturerMetas($id_manufacturer, $id_lang, $page_name)
{
$page_number = (int)Tools::getValue(‘p’);
$sql = ‘SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`
FROM `’._DB_PREFIX_.’manufacturer_lang` ml
LEFT JOIN `’._DB_PREFIX_.’manufacturer` m ON (ml.`id_manufacturer` = m.`id_manufacturer`)
WHERE ml.id_lang = ‘.(int)$id_lang.’
AND ml.id_manufacturer = ‘.(int)$id_manufacturer;
if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
{
if (empty($row[‘meta_description’]))
$row[‘meta_description’] = strip_tags($row[‘meta_description’]);
$row[‘meta_title’] = ($row[‘meta_title’] ? $row[‘meta_title’] : $row[‘name’]).(!empty($page_number) ? ‘ (‘.$page_number.’)’ : ”);
$row[‘meta_title’] .= ‘ – ‘.Configuration::get(‘PS_SHOP_NAME’);
return Meta::completeMetaTags($row, $row[‘meta_title’]);
}
return Meta::getHomeMetas($id_lang, $page_name);
}
/**
* Get supplier meta tags
*
* @since 1.5.0
* @param int $id_supplier
* @param int $id_lang
* @param string $page_name
* @return array
*/
public static function getSupplierMetas($id_supplier, $id_lang, $page_name)
{
$sql = ‘SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`
FROM `’._DB_PREFIX_.’supplier_lang` sl
LEFT JOIN `’._DB_PREFIX_.’supplier` s ON (sl.`id_supplier` = s.`id_supplier`)
WHERE sl.id_lang = ‘.(int)$id_lang.’
AND sl.id_supplier = ‘.(int)$id_supplier;
if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
{
if (empty($row[‘meta_description’]))
$row[‘meta_description’] = strip_tags($row[‘meta_description’]);
if (!empty($row[‘meta_title’]))
$row[‘meta_title’] = $row[‘meta_title’];
return Meta::completeMetaTags($row, $row[‘name’]);
}
return Meta::getHomeMetas($id_lang, $page_name);
}
/**
* Get CMS meta tags
*
* @since 1.5.0
* @param int $id_cms
* @param int $id_lang
* @param string $page_name
* @return array
*/
public static function getCmsMetas($id_cms, $id_lang, $page_name)
{
$sql = ‘SELECT `meta_title`, `meta_description`, `meta_keywords`
FROM `’._DB_PREFIX_.’cms_lang`
WHERE id_lang = ‘.(int)$id_lang.’
AND id_cms = ‘.(int)$id_cms;
if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
{
$row[‘meta_title’] = $row[‘meta_title’];
return Meta::completeMetaTags($row, $row[‘meta_title’]);
}
return Meta::getHomeMetas($id_lang, $page_name);
}
/**
* Get CMS category meta tags
*
* @since 1.5.0
* @param int $id_cms_category
* @param int $id_lang
* @param string $page_name
* @return array
*/
public static function getCmsCategoryMetas($id_cms_category, $id_lang, $page_name)
{
$sql = ‘SELECT `meta_title`, `meta_description`, `meta_keywords`
FROM `’._DB_PREFIX_.’cms_category_lang`
WHERE id_lang = ‘.(int)$id_lang.’
AND id_cms_category = ‘.(int)$id_cms_category;
if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
{
$row[‘meta_title’] = $row[‘meta_title’];
return Meta::completeMetaTags($row, $row[‘meta_title’]);
}
return Meta::getHomeMetas($id_lang, $page_name);
}
/**
* @since 1.5.0
*/
public static function completeMetaTags($meta_tags, $default_value, Context $context = null)
{
if (!$context)
$context = Context::getContext();
if (empty($meta_tags[‘meta_title’]))
$meta_tags[‘meta_title’] = $default_value;
if (empty($meta_tags[‘meta_description’]))
$meta_tags[‘meta_description’] = Configuration::get(‘PS_META_DESCRIPTION’, $context->language->id) ? Configuration::get(‘PS_META_DESCRIPTION’, $context->language->id) : ”;
if (empty($meta_tags[‘meta_keywords’]))
$meta_tags[‘meta_keywords’] = Configuration::get(‘PS_META_KEYWORDS’, $context->language->id) ? Configuration::get(‘PS_META_KEYWORDS’, $context->language->id) : ”;
return $meta_tags;
}
}
[/code]
…ou alors on est plus malin /feignant et on télécharge ce fichier Meta.php et on le place dans www/override/classes 😉 Il faut également penser à supprimer le fichier www/cache/classes_index.php – qui sera regénéré – pour que cet override soit pris en compte.
Le résultat avec le même exemple précédent sur les balises title est à présent :
[box type=”tick” size=”large”]< title > Mon produit < /title >[/box]
Il ne vous reste plus qu’à optimiser de manière efficace vos titres produits pour les rendre visibles 🙂
Si vous voulez gagner beaucoup de temps pour le remplissage de vos balises meta je vous conseille le module seo d’Olivier Clémence. Il vous permettra de remplir en quelques minutes les balises titres et descriptions de vos produits ainsi que les légendes de vos images. Vous pourrez même automatiser le tout pour ne plus avoir à vous en soucier.
Bonjour et grand merci pour ces précieuses informations.
Alors pour le coup ça à presque bien fonctionné pour moi sauf pour le nom du site lui même. Désormais je n’ai plus que le nom du site et non pas le titre autant dire que dans les résultats de google c’est extrêmement triste xD
http://lmgtfy.com/?q=very+kids
Si vous avez une idée je suis prenneur !
Grand merci d’avance pour le temps que vous saurez m’accorder.
( ps: prestashop 1.6.1.23 et php 7.2 )
Bonjour,
En effet, ce n’est pas l’idéal 😉
L’override est bien en place avec le fichier classes_index.php supprimé ?
” PrestaShop est déjà doté de bonnes bases et d’outils / fonctionnalités efficace quand il s’agit de parler « référencement« . On peut notamment relever : la génération auto des balises alt des images produits avec la possibilité de personnaliser celles-ci”
C’est une blague d’entendre ca !!
Prestashop bousille le référencement à la base pour nous faire acheter leurs modules
Pour pouvoir insérer un truc aussi simple qu’un “alt” aux images tout est bien pensé pour que ce sois impossible de le faire sans acheter un module…
Bonjour Alexandre,
Merci pour ton commentaire,
Je suis d’accord que PrestaShop ne comprend pas tous les outils dont on peut avoir besoin mais par défaut on peut modifier par exemple toutes les meta de toutes les pages.
Pour les balises ALT des images, elles sont déjà remplies donc on est dans le vert côté SEO même si je suis d’accord qu’on peut affiner ces ALT via un module type https://goo.gl/RRqmQ7 pour un coût modeste tout de même.
Peu être qu’en remontant l’information on pourrait voir une mise à jour avec ce champ, on peut toujours rêver 😉
Bonjour, il faut bien vider le cache lié au classes de PrestaShop en supprimant le fichier /cache/class_index.php et recharger la page ensuite 🙂
Merci Arnaud, très bon tuto qui marche impec avec une version 1.6.1.4
Bonjour Lafeve, j’aime quand on me pose la question et qu’on y répond 😀 Plus sérieusement, merci pour les autres car ça risque en aider plus d’un !
Il faut simplement supprimer le fichier class_index.php en effet.
Bonjour Steph, ça doit être un problème de cache je pense si ça marche pour certaines pages mais pas d’autres.
Bonjour j’ai prestashop 1.6.1.2 quand j’essaie j’ai une page blanche .
Ok trouvé pour prestashop 1.6.09, c’est en fait tout con, ouvrir meta.php et virer l’expression .’ – ‘.Configuration::get(‘PS_SHOP_NAME’) du fichier en faisant rechercher et supprimer.
Bonjour,
Cela ne marche pas sur les catégories :/
Bonjour Romain, avez-vous bien supprimé le fichier class_index.php ?
Bonjour,
Bravo pour cet article;
Je comprends pas trop la ligne 83, car le nom du site s’affichera dans la balise title.
Le mieux c’est de commenter la ligne 83 comme ceci :
// $row[‘meta_title’] .= ‘ – ‘.Configuration::get(‘PS_SHOP_NAME’);
Bien à vous,
Bonjour, merci pour la contribution SPKF 😉
Bonjour, je pense sans l’avoir fait qu’il doit y avoir une fonction “public static function getManufacturerMetas” dans laquelle on peut appliquer le modèle cité dans l’article 🙂
@Lokily : Parfait tout ça, c’était très étrange que ça ne fonctionne que pour certaines catégories et pas les autres. Merci pour le suivi et bonne journée 🙂
@Lokily : C’est bizarre que seulement certaines catégories n’aient pas été impactées car l’override s’applique aux catégories. Pour WordPress, le plugin s’appelle Subscribe to comments : http://wordpress.org/plugins/subscribe-to-comments.
@Lokily : Hello, et à vrai dire je n’ai pas encore testé l’override des catégories sur PrestaShop 1.6 mais cela ne fonctionne pas pour les catégories de niveau +1 c’est bien ça ?
Parfait, un gros merci ça marche à merveille !
Bonne info, merci. En effet ce n’est pas forcément utile d’avoir la récurrence du nom de la boutique.
En gros, quelques soit la page visité, le title reste le meme. Hors il devrait s’adapter en fonction des produits etc ..
@thomas : bonjour, je pense peut être aux urls canoniques à voir si c’est bien paramétré ?
@thomas : Bonjour, je pense que vous avez des pages en double ou peut être l’url canonique aussi, deux pistes à creuser. Le correctif présenté ici n’est pas la clé à mon avis.
Bonjour,
Je ne trouve pas le fichier à supprimer : classes_index.php je suis sous presta 1.4.7. Dans www/cache j’ai 1 dossier : cachefs et 1 fichier : index.php est-ce que c’est celui là d’index.php qu’il faut supprimer. Merci
@Doriane : Le fichier cité n’est présent qu’à partir de la 1.5 donc normal de ne pas le trouver dans ton cas 😉
Bonjour,
est ce aussi valable concernant prestashop 1.5.5 ?
merci
@zeg : Je n’ai pas eu l’occasion de testé sur la v1.5.5.0 aussi je vous propose de tester et de nous dire si c’est bon ici. Il s’agit d’un override donc aucun risque 😉
Désolé pour mon commentaire inutile concernant les pages CMS, cela fonctionne très bien avec votre fichier.
@Charly, Hello et content de savoir que le développement vous a servi 😉
Bonjour,
Très utile cette astuce.
Est-il possible de faire de même pour les pages CMS ?
Par avance merci.
Bonjour,
Merci pour ce partage !
Petite question, est ce que ce super code marche sous PS 1.9.11 ?
Ahh la la J’espère que OUI ..
Merci
Bonjour MathPOP, le tuto PrestaShop indiqué ici est pour la version 1.4 et non 1.9 qui n’existe pas encore !
ça serai pas 700 caractères plutôt que 70?
@passager : Bonjour, la balise title est bien optimisée à 70 caractères en effet.
Parfait ! Pile poil quand j’avais besoin de cette info, le timing est excellent ! Merci Arnaud