Jump to content

[Résolu] Rendre la structure META TITLE automatique


Recommended Posts

Bonjour,

 

Je souhaiterais définir une structure générique pour mes balises META TITLE sur toutes mes pages produits.

 

Par exemple avoir en permanance cette structure la:

"MARQUE - NOM DU PRODUIT - SOUS CATEGORIE"

 

Il existe des module dans le genre de "SEO auto fill" mais qui ne sont pas pratique du tout car il faut regénérer toutes les balises Titles produit dès qu'on en créé des nouveaux.

 

Est-il possible de définir cette règle directement dans le code ?

J'ai vu qu'on pouvait gérer le META.PHP dans l'override mais je ne connais pas le type de code à mettre.

 

Merci d'avance pour vos réponses.

Edited by eric1566 (see edit history)
  • Like 1
Link to comment
Share on other sites

Bonjour Eric,

 

Pour la version 1.5 :

 

Code à mettre dans Override/classes/Meta.Php (ou créer le fichier si inexistant) :

 

<?php
class Meta extends MetaCore
{
public static function getProductMetas($id_product, $id_lang, $page_name)
   {
       $sql = 'SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short`,            
               p.id_manufacturer,m.name as manufacturer_name,
               cl.name as category_name                
               FROM `'._DB_PREFIX_.'product` p
               LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`'.Shop::addSqlRestrictionOnLang('pl').')
               '.Shop::addSqlAssociation('product', 'p').'                
               LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = cl.`id_category_default`)
               LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)

               WHERE pl.id_lang = '.(int)$id_lang.'
                   AND pl.id_product = '.(int)$id_product.'
                   AND product_shop.active = 1';
       if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
       {
           if (empty($row['meta_description']))
               $row['meta_description'] = strip_tags($row['description_short']);


           /* Personnaliser ici le code qui apparaitra dans la balise TITLE de la fiche produit */	     

           $newMeta="";

           if(!empty($row['manufacturer_name']))
                   $newMeta.=$row['manufacturer_name']." - ";

           $newMeta.=$row['name'];

           if(!empty($row['category_name']))
                   $newMeta.=" - ".$row['category_name'];

           /* Fin newMeta */	   

           $row['meta_title']=$newMeta;

           return Meta::completeMetaTags($row, $row['name']);
       }

       return Meta::getHomeMetas($id_lang, $page_name);
   }
}

 

 

Pour la version 1.4 :

 

Il suffit de modifier la fonction getMetaTags dans le fichier Tools.php avec le code suivant (la modification se trouve dans le 2ème IF, le reste est identique) :

 

public static function getMetaTags($id_lang, $page_name)
{
 global $maintenance;
 if (!(isset($maintenance) AND (!in_array(Tools::getRemoteAddr(), explode(',', Configuration::get('PS_MAINTENANCE_IP'))))))
 {
/* Products specifics meta tags */
  if ($id_product = self::getValue('id_product'))
  {

$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT pl.`name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short`,
p.id_manufacturer,m.name as manufacturer_name,
cl.name as category_name
FROM `'._DB_PREFIX_.'product` p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`)
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = cl.`id_category_default`)
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
WHERE pl.id_lang = '.(int)($id_lang).' AND pl.id_product = '.(int)($id_product).' AND p.active = 1');


if ($row)
{
 if (empty($row['meta_description']))
  $row['meta_description'] = strip_tags($row['description_short']);

/* Personnaliser ici le code qui apparaitra dans la balise TITLE de la fiche produit */ 	

$newMeta="";

if(!empty($row['manufacturer_name']))
$newMeta.=$row['manufacturer_name']." - ";

$newMeta.=$row['name'];

if(!empty($row['category_name']))
$newMeta.=" - ".$row['category_name'];

/* Fin newMeta */	

$row['meta_title']=$newMeta;


 return self::completeMetaTags($row, $row['name']);
}
  }
  /* Categories specifics meta tags */
  elseif ($id_category = self::getValue('id_category'))
  {
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description`
FROM `'._DB_PREFIX_.'category_lang`
WHERE id_lang = '.(int)($id_lang).' AND id_category = '.(int)($id_category));
if ($row)
{
 if (empty($row['meta_description']))
  $row['meta_description'] = strip_tags($row['description']);
 return self::completeMetaTags($row, $row['name']);
}
  }
  /* Manufacturers specifics meta tags */
  elseif ($id_manufacturer = self::getValue('id_manufacturer'))
  {
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
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)
{
 if (empty($row['meta_description']))
  $row['meta_description'] = strip_tags($row['meta_description']);
 if (!empty($row['meta_title']))
  $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME');
 return self::completeMetaTags($row, $row['name']);
}
  }
  /* Suppliers specifics meta tags */
  elseif ($id_supplier = self::getValue('id_supplier'))
  {
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
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)
{
 if (empty($row['meta_description']))
  $row['meta_description'] = strip_tags($row['meta_description']);
 if (!empty($row['meta_title']))
  $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME');
 return self::completeMetaTags($row, $row['name']);
}
  }
  /* CMS specifics meta tags */
  elseif ($id_cms = self::getValue('id_cms'))
  {
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
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)
{
 $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME');
 return self::completeMetaTags($row, $row['meta_title']);
}
  }

  /* CMS category specifics meta tags */
  elseif ($id_cms = self::getValue('id_cms_category'))
  {
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
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));
if ($row)
{
 $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME');
 return self::completeMetaTags($row, $row['meta_title']);
}
  }
 }
 /* Default meta tags */
 return self::getHomeMetaTags($id_lang, $page_name);
}

Edited by Christophe Boix (see edit history)
  • Like 1
Link to comment
Share on other sites

Je modifie pour faire correspondre parfaitement à ton besoin et qui permet de ne pas afficher les tirets si la marque ou la catégorie est vide :

 

 if ($row)
	{
	 if (empty($row['meta_description']))
	  $row['meta_description'] = strip_tags($row['description_short']);
	 // return self::completeMetaTags($row, $row['name']);

/* Personnaliser ici le code qui apparaitra dans la balise TITLE de la fiche produit */		

$newMeta="";

if($row['manufacturer_name']!="")
	$newMeta.=$row['manufacturer_name']." - ";

$newMeta.=$row['name'];

if($row['category_name']!="")
	$newMeta.=" - ".$row['category_name'];

/* Fin newMeta */	  

$row['meta_title']=$newMeta;

	 return self::completeMetaTags($row, $row['name']);
	}


Edited by Christophe Boix (see edit history)
  • Like 1
Link to comment
Share on other sites

Voici le code pour la 1.5, dans Override/classes/Meta.Php :

 

public static function getProductMetas($id_product, $id_lang, $page_name)
{
 $sql = 'SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short`,  
   p.id_manufacturer,m.name as manufacturer_name,
   cl.name as category_name   
   FROM `'._DB_PREFIX_.'product` p
   LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`'.Shop::addSqlRestrictionOnLang('pl').')
   '.Shop::addSqlAssociation('product', 'p').'   
   LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = cl.`id_category_default`)
   LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)

   WHERE pl.id_lang = '.(int)$id_lang.'
 AND pl.id_product = '.(int)$id_product.'
 AND product_shop.active = 1';
 if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql))
 {
  if (empty($row['meta_description']))
   $row['meta_description'] = strip_tags($row['description_short']);


  /* Personnaliser ici le code qui apparaitra dans la balise TITLE de la fiche produit */		
  $newMeta="";

  if(!empty($row['manufacturer_name']))
 $newMeta.=$row['manufacturer_name']." - ";
  $newMeta.=$row['name'];
  if(!empty($row['category_name']))
 $newMeta.=" - ".$row['category_name'];
  /* Fin newMeta */	  
  $row['meta_title']=$newMeta;
  return Meta::completeMetaTags($row, $row['name']);
 }
 return Meta::getHomeMetas($id_lang, $page_name);
}

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

 

Moi je cherche juste à virer le nom de la boutique qui prend de la place pour rien à mon sens.

Dans la version 1.5.4.1 , je retrouve mon dossiers "classes" directement dans public html et non pas dans "override."

Ma question est de savoir si je dois remplacer le meta.php existant ou rajouter un deuxième meta.php avec les modifs qui m'interesse ?

 

Merci

Link to comment
Share on other sites

Bonjour fsb,

 

il faudrait créer un meta.php dans override/classes

 

car lors des mises à jours, prestashop écrasera les fichier dans le dossier classes et controller, du coup tu perdra cette modification lorsque tu mettras à jour.

Le dossier override sert à ne pas toucher au fichier se trouvant dans classes ou dans controller.

 

Il faut donc utiliser le dossier override, et créer un meta.php dans l'override.

As-tu besoin de savoir comment créer ce fichier?

 

Petits rappels au cas où :

 

Ne pas oublier de modifier la ligne 27

class MetaCore extends ObjectModel

par

class Meta extends MetaCore

 

Ensuite tu récupère juste les fonctions que tu veux modifier, sachant que l'info que tu veux enlever est :

 

Configuration::get('PS_SHOP_NAME')

 

Tu n'es pas obligé de copier toutes les fonctions dans ta page meta.php, tu peux laisser que les fonctions que tu modifieras.

Bon courage!

  • Like 1
Link to comment
Share on other sites

Merci Christophe pour cette réponse supersonic ^^

 

Je ne sais pas du tout comment créer ce fichier avec ce que je veux à l'intérieur et encore moins modifier la ligne 27.

 

J'ai bien trouvé des fichiers meta.php à télécharger par ci par la mais en ouvrant avec le bloc note, ça ressemblait pas du tout à un fichier bien propre. donc j'ai lâché l'affaire.

 

le placer dans l'override, ça je dois pouvoir le faire, ça doit être dans mes compétences. (je débute avec prestashop)

 

Si une âme charitable veut bien me créer ce fichier meta.php avec toutes les modifs que je n 'ai plus qu'à l'installer par la suite , ce serait bien plus simple pour un novice comme moi... :rolleyes:

 

Merci de ton aide

 

Steeve

Link to comment
Share on other sites

Super, Merci pour ton coup de pouce.

 

J'ai une autre petite question au passage si je peux me permettre.

 

J'ai une boutique en 1.5.3.1 et quand je regarde le dossier "classes" dans override, j'ai une centaine de fichier .php dont le fameux meta.php qui est vide d'ailleurs sur cette boutique.

Mais ma question est la suivante, sur l'autre boutique 1.5.4.1, lorsque j'ouvre classes dans l'override, je n'ai aucun fichier .php à part l'index.php.

 

Il y a un soucis ou c'est normal ?

Link to comment
Share on other sites

Pour info, voila ce que j'ai fait : j'ai installé ton fichier dans public_html/override/classes et également dans www/override/classes

J'ai ensuite supprimé le fichier class-index.php qui se trouve dans www/cache.

J'ai testé et le nom de ma boutique à bien disparu ce qui fait que je gagne de la place dans mes balises.

 

Par contre je ne m'explique toujours pas pourquoi ne trouve aucun fichier.php dans mon dossier override/classe.

 

Est ce que je dois copier/coller ceux se trouvant dans mon public_html/classes ?

 

Merci de ton aide en tout cas.

Link to comment
Share on other sites

Bonjour,

 

dans la 1.5.3.1, les fichiers étaient directement copiés dans l'override, ce qui facilitait la chose si on voulait modifier une classe. C'est pour cela que les fichiers étaient présents mais vides.

dans la 1.5.4.1, les fichiers ne sont plus présents, je ne sais pas la raison exacte, mais le fonctionnement reste identique : copier un fichier de /classes pour le coller dans /override/classes/ puis modifier la ligne 27 ( class xxx extends xxxCore ), comme dans la 1.5.3.1

Link to comment
Share on other sites

Est ce que je dois copier/coller ceux se trouvant dans mon public_html/classes ?

 

Le mieux est de ne copier que la classe dont tu as besoin (ex: meta.php) car si tu copie tout, il faudra modifier tous les fichiers pour écrire class xxx extend xxxCore , au lieu de class xxxCore extends module (par ex), sinon ta boutique ne fonctionnera pas (page blanche)

Link to comment
Share on other sites

[MODERATION] Sujet déplacé

 

motif : cela concerne plus la configuration de la boutique que plutôt une problématique dans le domaine du positionnement de votre boutique. Je déplace donc le sujet sur "Configuration et Installation de Prestashop". Vous aurez plus de chance d'avoir des réponses.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...