{"id":1680,"date":"2017-12-27T19:07:52","date_gmt":"2017-12-27T17:07:52","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1680"},"modified":"2017-12-27T19:07:52","modified_gmt":"2017-12-27T17:07:52","slug":"magento-2-ajouter-des-balises-canonical-sur-les-pages-cms","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2017\/12\/27\/magento-2-ajouter-des-balises-canonical-sur-les-pages-cms\/","title":{"rendered":"Magento 2 : Ajouter des balises canonical sur les pages cms"},"content":{"rendered":"<p>Par d\u00e9faut avec Magento ( c&rsquo;\u00e9tait d\u00e9j\u00e0 le cas pour magento 1 et \u00e7a l&rsquo;est toujours pour Magento 2 ), les pages CMS sont accessibles via plusieurs urls<\/p>\n<p>Ex : http:\/\/www.magento2.dev\/privacy-policy-cookie-restriction-mode\/ et http:\/\/www.magento2.dev\/privacy-policy-cookie-restriction-mode<\/p>\n<p>La seule diff\u00e9rence \u00e9tant la pr\u00e9sence du \u00ab\u00a0\/\u00a0\u00bb en fin de ligne.<\/p>\n<p>Pour les moteurs de recherche le contenu est donc pr\u00e9sent sur 2 pages diff\u00e9rentes ce qui cr\u00e9\u00e9 du duplicate content.<br \/>\nLa solution pour corriger cette probl\u00e9matique est d&rsquo;ajouter une balise \u00ab\u00a0canonical\u00a0\u00bb qui permettra de dire laquelle des urls on souhaite indexer.<br \/>\nDe mon c\u00f4t\u00e9 je part du postulat que c&rsquo;est l&rsquo;url avec un \u00ab\u00a0\/\u00a0\u00bb \u00e0 la fin.<\/p>\n<p>Pour cela nous allons faire un module Hhennes_CMS avec l&rsquo;arborescence suivante :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1681\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/magento-cms.jpg\" alt=\"Magento Cms module structure\" width=\"256\" height=\"232\" \/><\/p>\n<p>Voici les contenus des fichiers de d\u00e9claration du module<\/p>\n<p>etc\/module.xml<\/p>\n<pre lang=\"xml\" escaped=\"true\">&lt;config xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n        xsi:noNamespaceSchemaLocation=\"urn:magento:framework:Module\/etc\/module.xsd\"&gt;\r\n    &lt;module name=\"Hhennes_Cms\" setup_version=\"0.1.1\"&gt;\r\n        &lt;sequence&gt;\r\n            &lt;module name=\"Mage_Cms\"\/&gt;\r\n        &lt;\/sequence&gt;\r\n    &lt;\/module&gt;\r\n&lt;\/config&gt;<\/pre>\n<p>registration.php<\/p>\n<pre lang=\"php\" escaped=\"true\">&lt;?php\r\n\\Magento\\Framework\\Component\\ComponentRegistrar::register(\r\n    \\Magento\\Framework\\Component\\ComponentRegistrar::MODULE,\r\n    'Hhennes_Cms',\r\n    __DIR__\r\n);<\/pre>\n<p>La logique du module est ensuite d&rsquo;ajouter un nouveau bloc qui va ajouter cette balise sur l&rsquo;ensemble des pages cms.<br \/>\nPour cela nous allons cr\u00e9er le fichier view\/frontend\/layout\/cms_page_view.xml avec le contenu suivant :<\/p>\n<pre lang=\"xml\" escaped=\"true\">&lt;?xml version=\"1.0\"?&gt;\r\n&lt;page xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:View\/Layout\/etc\/page_configuration.xsd\"&gt;\r\n    &lt;body&gt;\r\n        &lt;referenceContainer name=\"head.additional\"&gt;\r\n            &lt;block class=\"Hhennes\\Cms\\Block\\Page\\Canonical\" name=\"cms_page.canonical\"\/&gt;\r\n        &lt;\/referenceContainer&gt;\r\n    &lt;\/body&gt;\r\n&lt;\/page&gt;<\/pre>\n<p>Ne reste plus qu&rsquo;a configurer le code du bloc dans Block\/Page\/Canonical.php<\/p>\n<pre lang=\"php\" escaped=\"true\">&lt;?php\r\n\r\nnamespace Hhennes\\Cms\\Block\\Page;\r\n\r\nuse \\Magento\\Framework\\View\\Element\\AbstractBlock;\r\n\r\nclass Canonical extends AbstractBlock {\r\n\r\n    \/** @var \\Magento\\Cms\\Model\\Page  *\/\r\n    protected $_page;\r\n\r\n    \/**\r\n     * Canonical constructor.\r\n     * @param Context $context\r\n     * @param array $data\r\n     * @param \\Magento\\Cms\\Model\\Page $page\r\n     *\/\r\n    public function __construct(\r\n        \\Magento\\Framework\\View\\Element\\Context $context,\r\n        array $data = [],\r\n        \\Magento\\Cms\\Model\\Page $page\r\n    )\r\n    {\r\n        $this-&gt;_page = $page;\r\n        parent::__construct($context, $data);\r\n    }\r\n\r\n    \/**\r\n     * @return \\Magento\\Cms\\Model\\Page\r\n     *\/\r\n    public function getPage()\r\n    {\r\n        return $this-&gt;_page;\r\n    }\r\n\r\n    \/**\r\n     * Get Canonical Page Url ( with trailing \/ )\r\n     *\/\r\n    public function getCanonicalPageUrl()\r\n    {\r\n        if ($this-&gt;getPage()) {\r\n            return $this-&gt;getUrl($this-&gt;getPage()-&gt;getIdentifier());\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    \/**\r\n     * Display block\r\n     * @return string\r\n     *\/\r\n    public function _toHtml()\r\n    {\r\n        if ( $this-&gt;getCanonicalPageUrl() ) {\r\n            return \"\\n\".'&lt;link rel=\"canonical\" href=\"'.$this-&gt;getCanonicalPageUrl().'\"\/&gt;'.\"\\n\";\r\n        }\r\n\r\n        return '';\r\n    }\r\n\r\n}<\/pre>\n<p>Si vous souhaitez indexer l&rsquo;url sans le slash, il vous suffit de remplacer la ligne<\/p>\n<pre lang=\"php\" escaped=\"true\">return $this-&gt;getUrl($this-&gt;getPage()-&gt;getIdentifier());<\/pre>\n<p>par<\/p>\n<pre lang=\"php\" escaped=\"true\">return $this-&gt;getUrl('').$this-&gt;getPage()-&gt;getIdentifier();<\/pre>\n<p>Une fois le module install\u00e9, la balise canonical est bien pr\u00e9sente \ud83d\ude42<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1682\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/canonical-magento2.jpg\" alt=\"Magento 2 cms canonical\" width=\"766\" height=\"379\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/canonical-magento2.jpg 766w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/canonical-magento2-300x148.jpg 300w\" sizes=\"auto, (max-width: 766px) 100vw, 766px\" \/><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Par d\u00e9faut avec Magento ( c&rsquo;\u00e9tait d\u00e9j\u00e0 le cas pour magento 1 et \u00e7a l&rsquo;est toujours pour Magento 2 ), les pages CMS sont accessibles via plusieurs urls Ex : http:\/\/www.magento2.dev\/privacy-policy-cookie-restriction-mode\/ et http:\/\/www.magento2.dev\/privacy-policy-cookie-restriction-mode La seule diff\u00e9rence \u00e9tant la pr\u00e9sence du \u00ab\u00a0\/\u00a0\u00bb en fin de ligne. Pour les moteurs de recherche le contenu est donc pr\u00e9sent [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[246],"tags":[511,110,482],"class_list":["post-1680","post","type-post","status-publish","format-standard","hentry","category-magento-2","tag-canonical","tag-cms","tag-magento-2"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1680","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1680"}],"version-history":[{"count":2,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1680\/revisions"}],"predecessor-version":[{"id":1684,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1680\/revisions\/1684"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1680"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1680"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}