Magento 2 : Ajouter des link alternate sur les pages cms

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

Sur magento 2 ( comme sur magento 1 ) , les contenus et notamment les pages cms sont accessibles via plusieurs url avec ou sans slash à la fin.

Vous pouvez le constater sur la page de la politique de confidentialité qui est à la fois disponible sous les urls :
http://magento2-demo.nexcess.net/privacy-policy-cookie-restriction-mode et http://magento2-demo.nexcess.net/privacy-policy-cookie-restriction-mode/

Au niveau Seo c’est assez moyen c’est pourquoi il est utile de préciser à Google quelle est la version à indexer.
Ceci peut être réalisé via l’ajout d’une balise link rel= »canonical ».

Nous allons voir ensemble comment réaliser cela pour magento 2 via un module qui s’appellera Hhennes/Cms
Ce module ajoutera automatiquement une balise canonical sur les pages cms, il est possible de configurer en back office quelle sera l’url à utiliser ( avec ou sans le slash )

Ce module sera dépendant du module Magento_Cms.

Je vais juste détailler le fonctionnement global, vous trouverez le lien vers github en fin d’article pour le télécharger. (sans la partie création initiale )

La logique est relativement simple , nous allons rajouter un block spécifique sur les pages cms dans le container « head.additional »
Pour cela il faut créer le fichier ( dans app/Code/Hennes/Cms ) view/frontend/layout/cms_page_view.xml ( il sera évalué uniquement lors de l’affichage d’une page cms ) avec le contenu suivant :

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="head.additional">
            <block class="Hhennes\Cms\Block\Page\Canonical" name="cms_page.canonical"/>
        </referenceContainer>
    </body>
</page>

 

Le contenu du block qui sera situé dans Block/Page/Canonical.php sera le suivant (version simplifiée ) :

<?php
 
namespace Hhennes\Cms\Block\Page;
 
use \Magento\Framework\View\Element\AbstractBlock;
 
class Canonical extends AbstractBlock
{
 
    /** @var \Magento\Cms\Model\Page */
    protected $_page;
 
    /** @var \Hhennes\Cms\Helper\Data */
    protected $_helper;
 
    /**
     * Canonical constructor.
     * @param \Magento\Framework\View\Element\Context $context
     * @param array $data
     * @param \Magento\Cms\Api\Data\PageInterface $page
     * @param \Hhennes\Cms\Helper\Data $helper
     */
    public function __construct(
        \Magento\Framework\View\Element\Context $context,
        array $data = [],
        \Magento\Cms\Api\Data\PageInterface $page,
        \Hhennes\Cms\Helper\Data $helper
    )
    {
        $this->_page = $page;
        $this->_helper = $helper;
        parent::__construct($context, $data);
    }
 
    /**
     * @return \Magento\Cms\Api\Data\PageInterface
     */
    public function getPage()
    {
        return $this->_page;
    }
 
    /**
     * Get Canonical Page Url ( simplified version )
     */
    public function getCanonicalPageUrl()
    {
        if ($this->getPage()) {
 
                return $this->getUrl() . $this->getPage()->getIdentifier();
        } else {
            return false;
        }
    }
 
    /**
     * Display block
     * @return string
     */
    public function _toHtml()
    {
        if ($this->getCanonicalPageUrl()) {
            return "\n" . '<link rel="canonical" href="' . $this->getCanonicalPageUrl() . '"/>' . "\n";
        }
 
        return '';
    }
 
}

Pour télécharger le module vous pouvez vous rendre sur github : https://github.com/nenes25/magento2-cms
Ou l’installer directement via composer avec la commande suivante :

 composer require hhennes/module-cms dev-master

Une fois installé la balise canonical sera bien présente sur la page :

Canonical magento 2

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *