00000000000000 Posted October 8, 2015 Share Posted October 8, 2015 Bonjour Prestashopiens et Prestashopiennes, Ayant créé mon site www.pausebento.fr il y a un peu plus d'un an, je me pose actuellement pas mal de questions sur mon référencement. Après une étude des différents mots-clés, il apparaît que les recherches autour du bento sont archi dominantes sur le mot-clé 'bento' et un peu 'bento box'. Pour le mot 'bento box', je me situe autour de la 10ème position (8ème aujourd'hui). Par contre, pour le mot 'bento', seulement 75ème aujourd'hui. Cette position est beaucoup trop faible pour que les visiteurs arrivent sur mon site d'où un faible nombre de visiteurs par jour (une centaine). Niveau conversion, c'est pas trop mal (des commandes arrivent). Au niveau du référencement, le contenu est roi. C'est pour cela que j'ai ajouté un blog, ai écrit mes propres fiches produits (pas de DC externe), les images sont bien nommées, ai ajouté un texte en page d'accueil, ai écrit des pages CMS (regroupées dans ce que j'appelle 'Guide d'utilisation' ainsi que les différentes informations sur la commande et le paiement dans 'Informations'). Des sites avec peu de contenu en lien avec le bento comme neobento.com ou encore decotec-paris.fr sont beaucoup mieux placés et je me demande comment cela se fait... Ai-je fait des erreurs au niveau du SEO ? Avez-vous des conseils ? Qu'est-ce qui ne va pas ? Je vous demande des conseils au niveau du référencement mais si vous avez d'autres conseils, je ne dis pas non Merci d'avance. David Link to comment Share on other sites More sharing options...
Presta_SEO Posted October 8, 2015 Share Posted October 8, 2015 Salut David, Le contenu ne fait pas tout, même si avoir une bonne optimisation SEO aide beaucoup (elle est même indispensable pour partir sur de bonnes bases SEO) c'est le linking qui fera ensuite la différence. (50% optimisation interne, 50% linking = 100% SEO^^) Le site à toujours été en https ? A titre de comparaison, neobento.com dispose de plus de 1000 liens pour 95 domaines référents alors que ton site compte 5 malheureux liens pour un seul référent ! Pas besoin d'aller chercher plus loin... Mais attention, il y a lien et lien. Le lien en commentaire ou l'échange de lien en sidebar ou en footer c'était avant la ménagerie de Google. Maintenant c'est du bon lien pas spécialement optimisé (10/20% max histoire de passer sous les radars de Google ) entouré de bon contenu (article bien rédigé et bien optimisé SEO) sur du bon support, voilà ce qui fonctionne... Link to comment Share on other sites More sharing options...
00000000000000 Posted October 8, 2015 Author Share Posted October 8, 2015 Salut David, Le contenu ne fait pas tout, même si avoir une bonne optimisation SEO aide beaucoup (elle est même indispensable pour partir sur de bonnes bases SEO) c'est le linking qui fera ensuite la différence. (50% optimisation interne, 50% linking = 100% SEO^^) Le site à toujours été en https ? Oui, depuis le début. A titre de comparaison, neobento.com dispose de plus de 1000 liens pour 95 domaines référents alors que ton site compte 5 malheureux liens pour un seul référent ! 1000 liens ! Et bah dis donc ! Pas besoin d'aller chercher plus loin... Mais attention, il y a lien et lien. Le lien en commentaire ou l'échange de lien en sidebar ou en footer c'était avant la ménagerie de Google. Maintenant c'est du bon lien pas spécialement optimisé (10/20% max histoire de passer sous les radars de Google ) entouré de bon contenu (article bien rédigé et bien optimisé SEO) sur du bon support, voilà ce qui fonctionne... Merci beaucoup ! Il faut donc que je bosse mon linking... Des conseils pour obtenir des liens "de qualité" ? Cordialement, David Link to comment Share on other sites More sharing options...
Presta_SEO Posted October 8, 2015 Share Posted October 8, 2015 Avoir des entrées sur de bons support publics (un bon début), avoir des entrées sur de bons supports privés (le top), faire des échanges d'articles sur des supports de thématique proche ou similaire, mettre quelques liens dans des forums spécialisés (présentation du site, signature)... Link to comment Share on other sites More sharing options...
00000000000000 Posted October 8, 2015 Author Share Posted October 8, 2015 Je vous ai répondu par MP. Vu le temps que cela risque de prendre pour le linking, je pense qu'un prestataire sera nécessaire. Surtout vu le retard niveau linking que j'ai pris sur mes concurrents ... Link to comment Share on other sites More sharing options...
Presta_SEO Posted October 8, 2015 Share Posted October 8, 2015 Sage décision, on continue en MP. Link to comment Share on other sites More sharing options...
00000000000000 Posted October 9, 2015 Author Share Posted October 9, 2015 Je réfléchis à votre proposition (j'ai pour habitude de ne jamais prendre une décision sans réflexion). Si d'autres personnes ont d'autres remarques, n'hésitez pas Il ne doit pas y avoir qu'un problème de linking ou liens entrants, si ? Merci d'avance; David Link to comment Share on other sites More sharing options...
Presta_SEO Posted October 9, 2015 Share Posted October 9, 2015 (edited) Il y a toujours des choses à améliorer, je vois déjà qu'il y a cannibalisation/concurrence/dilution de pages entre la home et les catégories accessoires et bento, balises Title comprises (l'idéal c'est : une page = une requête). En parlant de Title, celle de la catégorie bento est bcp trop longue (65 car. max). Les descriptions de tes catégories sont trop lights aussi, il faut du contenu, optimisé et pertinent de préférence... Edited October 9, 2015 by Presta_SEO (see edit history) Link to comment Share on other sites More sharing options...
00000000000000 Posted October 9, 2015 Author Share Posted October 9, 2015 Il y a toujours des choses à améliorer, je vois déjà qu'il y a cannibalisation/concurrence/dilution de pages entre la home et les catégories accessoires et bento, balises Title comprises (l'idéal c'est : une page = une requête). Niveaux Titres c'est vrai que je suis perdu. Tous les fiches produits de ma catégorie Bento ont 'bento' dans leur titre avec le nom du produit, faut-il varier les noms 'bento', 'bento box', 'boîte à bento' ? En parlant de Title, celle de la catégorie bento est bcp trop longue (65 car. max). La description pour Google est courte (moins de 65). Pour le site, on peut pas dépasser les 65 caractères affichés en description ? Niveau SEO, plus elle est longue, mieux c'est, non ? Les descriptions de tes catégories sont trop lights aussi, il faut du contenu, optimisé et pertinent de préférence... Je sors ma plume électronique pour modifier ça... Link to comment Share on other sites More sharing options...
Presta_SEO Posted October 9, 2015 Share Posted October 9, 2015 (edited) Niveaux Titres c'est vrai que je suis perdu. Tous les fiches produits de ma catégorie Bento ont 'bento' dans leur titre avec le nom du produit, faut-il varier les noms 'bento', 'bento box', 'boîte à bento' ? Il faut déjà supprimer le titre du site dans le code, ensuite essayer de cloisonner les requêtes, bento compris dans la mesure du possible. La description pour Google est courte (moins de 65). Pour le site, on peut pas dépasser les 65 caractères affichés en description ? Niveau SEO, plus elle est longue, mieux c'est, non ? Je comprends pas très bien ton raisonnement, 65 caractères c'est pour toutes les balises TITLE en général. Niveau SEO, plus elle est longue plus ça dilue le poids des mots Edited October 9, 2015 by Presta_SEO (see edit history) Link to comment Share on other sites More sharing options...
00000000000000 Posted October 9, 2015 Author Share Posted October 9, 2015 Niveaux Titres c'est vrai que je suis perdu. Tous les fiches produits de ma catégorie Bento ont 'bento' dans leur titre avec le nom du produit, faut-il varier les noms 'bento', 'bento box', 'boîte à bento' ? Il faut déjà supprimer le titre du site dans le code, ensuite essayer de cloisonner les requêtes, bento compris dans la mesure du possible. Pour supprimer le titre du site, pas compliqué à réaliser (j'ai vu des tutos). J'ajoute à ma to-do list. Pour le cloisonnement des requêtes, c'est difficile. Des astuces ? La description pour Google est courte (moins de 65). Pour le site, on peut pas dépasser les 65 caractères affichés en description ? Niveau SEO, plus elle est longue, mieux c'est, non ? Je comprends pas très bien ton raisonnement, 65 caractères c'est pour toutes les balises TITLE en général. Niveau SEO, plus elle est longue plus ça dilue le poids des mots Dans la création ou modification des catégories, il y a une partie 'visible' pour les visiteurs (nom + description) et une autre partie pour les robots de Google (Balise Titre + Meta Description). J'ai pourtant fait attention à respecter le nombre de caractères pour notre ami Google. Quelles catégories sont trop longues ? Link to comment Share on other sites More sharing options...
00000000000000 Posted October 9, 2015 Author Share Posted October 9, 2015 (edited) Concernant la suppression du nom de la boutique dans les titres, j'ai un problème. J'ai trouvé un tuto qui dit de modifier le fichier Meta.php (enlever les .’ – ‘.Configuration::get(‘PS_SHOP_NAME’)). En faisant cela, j'obtiens une page blanche. Voici le code de base : <?php /* * 2007-2014 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class MetaCore extends ObjectModel { public $page; public $configurable = 1; public $title; public $description; public $keywords; public $url_rewrite; /** * @see ObjectModel::$definition */ public static $definition = array( 'table' => 'meta', 'primary' => 'id_meta', 'multilang' => true, 'multilang_shop' => true, 'fields' => array( 'page' => array('type' => self::TYPE_STRING, 'validate' => 'isFileName', 'required' => true, 'size' => 64), 'configurable' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), /* Lang fields */ 'title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128), 'description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), 'keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), 'url_rewrite' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'size' => 255), ), ); public static function getPages($exclude_filled = false, $add_page = false) { $selected_pages = array(); if (!$files = Tools::scandir(_PS_CORE_DIR_.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'front'.DIRECTORY_SEPARATOR, 'php', '', true)) die(Tools::displayError('Cannot scan root directory')); // Exclude pages forbidden $exlude_pages = array( 'category', 'changecurrency', 'cms', 'footer', 'header', 'pagination', 'product', 'product-sort', 'statistics' ); foreach ($files as $file) { if ($file != 'index.php' && !in_array(strtolower(str_replace('Controller.php', '', $file)), $exlude_pages)) { $class_name = str_replace('.php', '', $file); $reflection = class_exists($class_name) ? new ReflectionClass(str_replace('.php', '', $file)) : false; $properties = $reflection ? $reflection->getDefaultProperties() : array(); if (isset($properties['php_self'])) $selected_pages[$properties['php_self']] = $properties['php_self']; elseif (preg_match('/^[a-z0-9_.-]*\.php$/i', $file)) $selected_pages[strtolower(str_replace('Controller.php', '', $file))] = strtolower(str_replace('Controller.php', '', $file)); elseif (preg_match('/^([a-z0-9_.-]*\/)?[a-z0-9_.-]*\.php$/i', $file)) $selected_pages[strtolower(sprintf(Tools::displayError('%2$s (in %1$s)'), dirname($file), str_replace('Controller.php', '', basename($file))))] = strtolower(str_replace('Controller.php', '', basename($file))); } } // Add modules controllers to list (this function is cool !) foreach (glob(_PS_MODULE_DIR_.'*/controllers/front/*.php') as $file) { $filename = Tools::strtolower(basename($file, '.php')); if ($filename == 'index') continue; $module = Tools::strtolower(basename(dirname(dirname(dirname($file))))); $selected_pages[$module.' - '.$filename] = 'module-'.$module.'-'.$filename; } // Exclude page already filled if ($exclude_filled) { $metas = Meta::getMetas(); foreach ($metas as $meta) if (in_array($meta['page'], $selected_pages)) unset($selected_pages[array_search($meta['page'], $selected_pages)]); } // Add selected page if ($add_page) { $name = $add_page; if (preg_match('#module-([a-z0-9_-]+)-([a-z0-9]+)$#i', $add_page, $m)) $add_page = $m[1].' - '.$m[2]; $selected_pages[$add_page] = $name; asort($selected_pages); } return $selected_pages; } public static function getMetas() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT * FROM '._DB_PREFIX_.'meta ORDER BY page ASC'); } public static function getMetasByIdLang($id_lang) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'meta` m LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON m.`id_meta` = ml.`id_meta` WHERE ml.`id_lang` = '.(int)$id_lang .Shop::addSqlRestrictionOnLang('ml'). 'ORDER BY page ASC'); } public static function getMetaByPage($page, $id_lang) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT * FROM '._DB_PREFIX_.'meta m LEFT JOIN '._DB_PREFIX_.'meta_lang ml ON m.id_meta = ml.id_meta WHERE ( m.page = "'.pSQL($page).'" OR m.page = "'.pSQL(str_replace('-', '', strtolower($page))).'" ) AND ml.id_lang = '.(int)$id_lang.' '.Shop::addSqlRestrictionOnLang('ml')); } public function update($null_values = false) { if (!parent::update($null_values)) return false; return Tools::generateHtaccess(); } public function delete() { if (!parent::delete()) return false; return Tools::generateHtaccess(); } public function deleteSelection($selection) { if (!is_array($selection)) die(Tools::displayError()); $result = true; foreach ($selection as $id) { $this->id = (int)$id; $result = $result && $this->delete(); } return $result && Tools::generateHtaccess(); } public static function getEquivalentUrlRewrite($new_id_lang, $id_lang, $url_rewrite) { return Db::getInstance()->getValue(' SELECT url_rewrite FROM `'._DB_PREFIX_.'meta_lang` WHERE id_meta = ( SELECT id_meta FROM `'._DB_PREFIX_.'meta_lang` WHERE url_rewrite = \''.pSQL($url_rewrite).'\' AND id_lang = '.(int)$id_lang.' AND id_shop = '.Context::getContext()->shop->id.' ) AND id_lang = '.(int)$new_id_lang.' AND id_shop = '.Context::getContext()->shop->id); } /** * @since 1.5.0 */ public static function getMetaTags($id_lang, $page_name, $title = '') { global $maintenance; if (!(isset($maintenance) && (!in_array(Tools::getRemoteAddr(), explode(',', Configuration::get('PS_MAINTENANCE_IP')))))) { if ($page_name == 'product' && ($id_product = Tools::getValue('id_product'))) return Meta::getProductMetas($id_product, $id_lang, $page_name); elseif ($page_name == 'category' && ($id_category = Tools::getValue('id_category'))) return Meta::getCategoryMetas($id_category, $id_lang, $page_name, $title); elseif ($page_name == 'manufacturer' && ($id_manufacturer = Tools::getValue('id_manufacturer'))) return Meta::getManufacturerMetas($id_manufacturer, $id_lang, $page_name); elseif ($page_name == 'supplier' && ($id_supplier = Tools::getValue('id_supplier'))) return Meta::getSupplierMetas($id_supplier, $id_lang, $page_name); elseif ($page_name == 'cms' && ($id_cms = Tools::getValue('id_cms'))) return Meta::getCmsMetas($id_cms, $id_lang, $page_name); elseif ($page_name == 'cms' && ($id_cms_category = Tools::getValue('id_cms_category'))) return Meta::getCmsCategoryMetas($id_cms_category, $id_lang, $page_name); } return Meta::getHomeMetas($id_lang, $page_name); } /** * 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') : 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 product meta tags * * @since 1.5.0 * @param int $id_product * @param int $id_lang * @param string $page_name * @return array */ public static function getProductMetas($id_product, $id_lang, $page_name) { $sql = 'SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short` 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').' 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']); return Meta::completeMetaTags($row, $row['name']); } return Meta::getHomeMetas($id_lang, $page_name); } /** * 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'); $cache_id = 'Meta::getCategoryMetas'.(int)$id_category.'-'.(int)$id_lang; if (!Cache::isStored($cache_id)) { 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.')' : '').' - '.Configuration::get('PS_SHOP_NAME'); else $row['meta_title'] = $row['name'].(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME'); if (!empty($title)) $row['meta_title'] = $title.(!empty($page_number) ? ' ('.$page_number.')' : '').' - '.Configuration::get('PS_SHOP_NAME'); $result = Meta::completeMetaTags($row, $row['name']); } else $result = Meta::getHomeMetas($id_lang, $page_name); Cache::store($cache_id, $result); } return Cache::retrieve($cache_id); } /** * 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'].' - '.Configuration::get('PS_SHOP_NAME'); 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'].' - '.Configuration::get('PS_SHOP_NAME'); 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'].' - '.Configuration::get('PS_SHOP_NAME'); 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.' - '.Configuration::get('PS_SHOP_NAME'); 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; } } Le code modifié donne : <?php /* * 2007-2014 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class MetaCore extends ObjectModel { public $page; public $configurable = 1; public $title; public $description; public $keywords; public $url_rewrite; /** * @see ObjectModel::$definition */ public static $definition = array( 'table' => 'meta', 'primary' => 'id_meta', 'multilang' => true, 'multilang_shop' => true, 'fields' => array( 'page' => array('type' => self::TYPE_STRING, 'validate' => 'isFileName', 'required' => true, 'size' => 64), 'configurable' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), /* Lang fields */ 'title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128), 'description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), 'keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), 'url_rewrite' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'size' => 255), ), ); public static function getPages($exclude_filled = false, $add_page = false) { $selected_pages = array(); if (!$files = Tools::scandir(_PS_CORE_DIR_.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'front'.DIRECTORY_SEPARATOR, 'php', '', true)) die(Tools::displayError('Cannot scan root directory')); // Exclude pages forbidden $exlude_pages = array( 'category', 'changecurrency', 'cms', 'footer', 'header', 'pagination', 'product', 'product-sort', 'statistics' ); foreach ($files as $file) { if ($file != 'index.php' && !in_array(strtolower(str_replace('Controller.php', '', $file)), $exlude_pages)) { $class_name = str_replace('.php', '', $file); $reflection = class_exists($class_name) ? new ReflectionClass(str_replace('.php', '', $file)) : false; $properties = $reflection ? $reflection->getDefaultProperties() : array(); if (isset($properties['php_self'])) $selected_pages[$properties['php_self']] = $properties['php_self']; elseif (preg_match('/^[a-z0-9_.-]*\.php$/i', $file)) $selected_pages[strtolower(str_replace('Controller.php', '', $file))] = strtolower(str_replace('Controller.php', '', $file)); elseif (preg_match('/^([a-z0-9_.-]*\/)?[a-z0-9_.-]*\.php$/i', $file)) $selected_pages[strtolower(sprintf(Tools::displayError('%2$s (in %1$s)'), dirname($file), str_replace('Controller.php', '', basename($file))))] = strtolower(str_replace('Controller.php', '', basename($file))); } } // Add modules controllers to list (this function is cool !) foreach (glob(_PS_MODULE_DIR_.'*/controllers/front/*.php') as $file) { $filename = Tools::strtolower(basename($file, '.php')); if ($filename == 'index') continue; $module = Tools::strtolower(basename(dirname(dirname(dirname($file))))); $selected_pages[$module.' - '.$filename] = 'module-'.$module.'-'.$filename; } // Exclude page already filled if ($exclude_filled) { $metas = Meta::getMetas(); foreach ($metas as $meta) if (in_array($meta['page'], $selected_pages)) unset($selected_pages[array_search($meta['page'], $selected_pages)]); } // Add selected page if ($add_page) { $name = $add_page; if (preg_match('#module-([a-z0-9_-]+)-([a-z0-9]+)$#i', $add_page, $m)) $add_page = $m[1].' - '.$m[2]; $selected_pages[$add_page] = $name; asort($selected_pages); } return $selected_pages; } public static function getMetas() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT * FROM '._DB_PREFIX_.'meta ORDER BY page ASC'); } public static function getMetasByIdLang($id_lang) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'meta` m LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON m.`id_meta` = ml.`id_meta` WHERE ml.`id_lang` = '.(int)$id_lang .Shop::addSqlRestrictionOnLang('ml'). 'ORDER BY page ASC'); } public static function getMetaByPage($page, $id_lang) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT * FROM '._DB_PREFIX_.'meta m LEFT JOIN '._DB_PREFIX_.'meta_lang ml ON m.id_meta = ml.id_meta WHERE ( m.page = "'.pSQL($page).'" OR m.page = "'.pSQL(str_replace('-', '', strtolower($page))).'" ) AND ml.id_lang = '.(int)$id_lang.' '.Shop::addSqlRestrictionOnLang('ml')); } public function update($null_values = false) { if (!parent::update($null_values)) return false; return Tools::generateHtaccess(); } public function delete() { if (!parent::delete()) return false; return Tools::generateHtaccess(); } public function deleteSelection($selection) { if (!is_array($selection)) die(Tools::displayError()); $result = true; foreach ($selection as $id) { $this->id = (int)$id; $result = $result && $this->delete(); } return $result && Tools::generateHtaccess(); } public static function getEquivalentUrlRewrite($new_id_lang, $id_lang, $url_rewrite) { return Db::getInstance()->getValue(' SELECT url_rewrite FROM `'._DB_PREFIX_.'meta_lang` WHERE id_meta = ( SELECT id_meta FROM `'._DB_PREFIX_.'meta_lang` WHERE url_rewrite = \''.pSQL($url_rewrite).'\' AND id_lang = '.(int)$id_lang.' AND id_shop = '.Context::getContext()->shop->id.' ) AND id_lang = '.(int)$new_id_lang.' AND id_shop = '.Context::getContext()->shop->id); } /** * @since 1.5.0 */ public static function getMetaTags($id_lang, $page_name, $title = '') { global $maintenance; if (!(isset($maintenance) && (!in_array(Tools::getRemoteAddr(), explode(',', Configuration::get('PS_MAINTENANCE_IP')))))) { if ($page_name == 'product' && ($id_product = Tools::getValue('id_product'))) return Meta::getProductMetas($id_product, $id_lang, $page_name); elseif ($page_name == 'category' && ($id_category = Tools::getValue('id_category'))) return Meta::getCategoryMetas($id_category, $id_lang, $page_name, $title); elseif ($page_name == 'manufacturer' && ($id_manufacturer = Tools::getValue('id_manufacturer'))) return Meta::getManufacturerMetas($id_manufacturer, $id_lang, $page_name); elseif ($page_name == 'supplier' && ($id_supplier = Tools::getValue('id_supplier'))) return Meta::getSupplierMetas($id_supplier, $id_lang, $page_name); elseif ($page_name == 'cms' && ($id_cms = Tools::getValue('id_cms'))) return Meta::getCmsMetas($id_cms, $id_lang, $page_name); elseif ($page_name == 'cms' && ($id_cms_category = Tools::getValue('id_cms_category'))) return Meta::getCmsCategoryMetas($id_cms_category, $id_lang, $page_name); } return Meta::getHomeMetas($id_lang, $page_name); } /** * 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']; $ret['meta_description'] = (isset($metas['description']) && $metas['description']) ? $metas['description'] : ''; $ret['meta_keywords'] = (isset($metas['keywords']) && $metas['keywords']) ? $metas['keywords'] : ''; return $ret; } /** * Get product meta tags * * @since 1.5.0 * @param int $id_product * @param int $id_lang * @param string $page_name * @return array */ public static function getProductMetas($id_product, $id_lang, $page_name) { $sql = 'SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short` 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').' 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']); return Meta::completeMetaTags($row, $row['name']); } return Meta::getHomeMetas($id_lang, $page_name); } /** * 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'); $cache_id = 'Meta::getCategoryMetas'.(int)$id_category.'-'.(int)$id_lang; if (!Cache::isStored($cache_id)) { 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.')' : ''); $result = Meta::completeMetaTags($row, $row['name']); } else $result = Meta::getHomeMetas($id_lang, $page_name); Cache::store($cache_id, $result); } return Cache::retrieve($cache_id); } /** * 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.')' : ''); 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; } } Voyez-vous une erreur ? Un problème de synthaxe ? Edited October 9, 2015 by Pause bentô (see edit history) Link to comment Share on other sites More sharing options...
Presta_SEO Posted October 9, 2015 Share Posted October 9, 2015 Ouch, je passe mon tour^^ ! Le codage c'est pas ma tasse de thé, et mon dev est déjà parti en week-end... Link to comment Share on other sites More sharing options...
Presta_SEO Posted October 9, 2015 Share Posted October 9, 2015 Pour supprimer le titre du site, pas compliqué à réaliser (j'ai vu des tutos). J'ajoute à ma to-do list. Pour le cloisonnement des requêtes, c'est difficile. Des astuces ? Non, seulement du bon sens... Dans la création ou modification des catégories, il y a une partie 'visible' pour les visiteurs (nom + description) et une autre partie pour les robots de Google (Balise Titre + Meta Description). J'ai pourtant fait attention à respecter le nombre de caractères pour notre ami Google. Quelles catégories sont trop longues ? Tu as déjà la catégorie https://www.pausebento.fr/12-nos-bento qui compte 88 caractères ! Link to comment Share on other sites More sharing options...
00000000000000 Posted October 9, 2015 Author Share Posted October 9, 2015 (edited) Opération suppression du nom de la boutique dans les métas Titres réussie grâce à ce lien.http://arnaud-merigeau.fr/optimisez-les-balises-meta-title-dans-prestashop/ Maintenant, modification des descriptions des catégories et sous-catégories. Pour le cloisonnement des requêtes, ne faut-il pas désindexer (no_follow) les pages produits ? Edited October 9, 2015 by Pause bentô (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now