Optimisez les balises meta title dans PrestaShop

PrestaShop
  • Accueil
  • Blog
  • Optimisez les balises meta title dans PrestaShop

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.

36 commentaires sur “Optimisez les balises meta title dans PrestaShop

  1. 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

    1. @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 😉

  2. 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

    1. @Doriane : Le fichier cité n’est présent qu’à partir de la 1.5 donc normal de ne pas le trouver dans ton cas 😉

  3. @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.

  4. @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 ?

  5. @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 🙂

  6. 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 🙂

  7. 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,

  8. 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.

  9. 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 !

  10. 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 🙂

  11.  » 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…

    1. 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 😉

  12. 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 )

    1. Bonjour,
      En effet, ce n’est pas l’idéal 😉
      L’override est bien en place avec le fichier classes_index.php supprimé ?

Laisser un commentaire

Consultez les autres articles