Vous avez sans doute eu besoin de supprimer à un moment ou un autre le nom de votre boutique Prestashop des meta title. Titre présent dans toutes les meta title sous la forme :

META TITLE DE LA PAGE CMS MACHINE – NOM DE LA BOUTIQUE ou bien
META TITLE DU PRODUIT BIDULE – NOM DE LA BOUTIQUE

pour cela vous n’avez pas vraiment eu de mal à trouver un tutoriel en ligne détaillé pour réaliser cette tâche, et ce assez facilement (sans oublier bien sûr de prendre un tuto rigoureusement conçu, j’entends par là au travers de l’override (voir ici : pourquoi utiliser l’override lorsque l’on souhaite modifier les fonctionnalités de Prestashop).

Seulement voilà, vous n’obtenez pas le résultat attendu, en effet les pages de catégorie affichent toujours le nom de votre boutique dans leur meta title !! (arrachement de cheveux, même chez un développeur averti).

Je vous donne la solution la plus pratique, nous allons overrider le classe-controller FrontController.

La solution

La raison pour laquelle le nom de la boutique continue de s’afficher sur les pages de catégorie vient de la manière dont est hiérarchiser le développement/comportement de la donnée meta title au travers du FrontController de Prestashop, avant d’assigner les variables Smarty pour le template header.tpl
Il m’a fallut un certain temps de débogage pour trouver cela mais voici la solution la plus rapide, reprendre une implémentation présente dans la fonction init() du FrontController et la placer dans la fonction display(), voici la nouvelle fonction display de la classe FrontController overridée (/override/classe/controller/FrontController.php) :

public function display()
{

Tools::safePostVars();

// assign css_files and js_files at the very last time
if ((Configuration::get(‘PS_CSS_THEME_CACHE’) || Configuration::get(‘PS_JS_THEME_CACHE’)) && is_writable(_PS_THEME_DIR_.’cache’))
{

// CSS compressor management
if (Configuration::get(‘PS_CSS_THEME_CACHE’))

$this->css_files = Media::cccCss($this->css_files);

//JS compressor management
if (Configuration::get(‘PS_JS_THEME_CACHE’) && !$this->useMobileTheme())

$this->js_files = Media::cccJs($this->js_files);

}
$this->context->smarty->assign(array(

‘css_files’ => $this->css_files,
‘js_files’ => ($this->getLayout() && (bool)Configuration::get(‘PS_JS_DEFER’)) ? array() : $this->js_files,
‘js_defer’ => (bool)Configuration::get(‘PS_JS_DEFER’),
‘errors’ => $this->errors,
‘display_header’ => $this->display_header,
‘display_footer’ => $this->display_footer,

));

if (!empty($this->page_name))

$page_name = $this->page_name;

elseif (!empty($this->php_self))

$page_name = $this->php_self;

elseif (Tools::getValue(‘fc’) == ‘module’ && $module_name !=  » && (Module::getInstanceByName($module_name) instanceof PaymentModule))

$page_name = ‘module-payment-submit’;

// @retrocompatibility Are we in a module ?
elseif (preg_match(‘#^’.preg_quote($this->context->shop->physical_uri, ‘#’).’modules/([a-zA-Z0-9_-]+?)/(.*)$#’, $_SERVER[‘REQUEST_URI’], $m))

$page_name = ‘module-‘.$m[1].’-‘.str_replace(array(‘.php’, ‘/’), array( », ‘-‘), $m[2]);

else
{

$page_name = Dispatcher::getInstance()->getController();
$page_name = (preg_match(‘/^[0-9]/’, $page_name) ? ‘page_’.$page_name : $page_name);

}

$this->context->smarty->assign(Meta::getMetaTags($this->context->language->id, $page_name));

$layout = $this->getLayout();
if ($layout)
{

if ($this->template)

$template = $this->context->smarty->fetch($this->template);

else // For retrocompatibility with 1.4 controller
{

ob_start();
$this->displayContent();
$template = ob_get_contents();
ob_clean();

}
$template = $this->context->smarty->assign(‘template’, $template);
$this->smartyOutputContent($layout);

}
else
{

Tools::displayAsDeprecated(‘layout.tpl is missing in your theme directory’);
if ($this->display_header)

$this->smartyOutputContent(_PS_THEME_DIR_.’header.tpl’);

if ($this->template)

$this->smartyOutputContent($this->template);

else // For retrocompatibility with 1.4 controller

$this->displayContent();

if ($this->display_footer)

$this->smartyOutputContent(_PS_THEME_DIR_.’footer.tpl’);

}
return true;

}

En utilisant cette fonction overridée de display ainsi que les changements que vous aurez apportés via l’override de la classe Meta, le nom de la boutique ne sera plus présent dans le meta title des pages de catégorie.

En espérant vous avoir aidé dans votre dev ! Pour toute question, précision ou pour apporter votre pierre à l’édifice, faites usage des commentaires en dessous.

David

EDIT :

Comme l’a très justement rappelé Eolia en commentaire de cet article, le module de navigation à facettes (blocklayered) ajoute également le nom de la boutique dans la balise titre, ceci se trouve au niveau du fichier de base du module /modules/blocklayered/blocklayered.php sur la ligne suivante  : $smarty->assign(‘meta_title’, $title.’ – ‘.Configuration::get(‘PS_SHOP_NAME’));
Il vous suffira de supprimer la partie incluant le tiret et le nom de la boutique.

Il est bon également de rappeler qu’en 2019 Google affiche de lui-même le nom du site en fin de balise titre la majorité du temps. La question se pose donc de l’utilité de garder cette fonction de Prestashop ou non.