La Lanterne Rouge

La Lanterne Rouge

Warning: Geek Inside

Publié le par Nanawel
Publié dans : #magento | #php | #module | #ecommerce | #github

En ce moment au boulot je n'ai pas le temps que je voudrais pour coder des modules sur la plateforme Magento (qui me permet de consommer de la nourriture et du matos informatique depuis quatre ans). J'ai donc décidé de me mettre "à mon compte" et de développer sur mon temps libre. Qui sait ? cela pourra peut-être intéresser des gens... (et des recruteurs ^^)

[Magento] Réécritures de 404 par regexp

Le petit module dont je viens de terminer la première version tire son idée de besoins récurrents chez les clients de la société dans laquelle je travaille. Il arrive en effet fréquemment de devoir gérer des redirections d'URL en masse, par exemple suite à la restructuration du catalogue, ou suite simplement à la migration d'une boutique en ligne vers Magento.

 

Un exemple simple : la navigation par couches (ou "à facettes") générait sur l'ancienne plateforme d'un client des URL de cette forme :

http://www.boutique.com/categorieA-valeur1-valeur2.html

dont l'équivalence dans Magento après migration aurait pu donner ceci :

http://www.boutique.com/categorieA.html?filtre1=valeur1&filtre2=valeur2

Je simplifie volontairement, car il y avait en réalité une dizaine de valeurs en suffixe (!), toutes toujours présentes même si elles étaient vides (elles avaient alors la valeur "0").

 

Dans un pareil cas, le client ne souhaite pas forcément rediriger chaque URL vers son équivalent exact, mais simplement vers la catégorie correspondante afin de conserver au maximum le référencement. Parfois, une simple redirection permanente vers la (nouvelle) page d'accueil sera même suffisant. Essayer de retrouver toutes les URLs (donc toutes les combinaisons de valeurs !) par crawling ou autre n'est de toute manière clairement pas gérable.

Une fois la migration terminée, et si on n'y prend pas garde, on se retrouve rapidement dans Google Webmaster Tools à devoir gérer des dizaines, des centaines, voire des milliers d'URL en erreur, tout simplement parce qu'on n'a pas (suffisamment) géré la transition. Dans le cas dont je parle, nous avions quand même anticipé la réécriture de plusieurs centaines de milliers d'URL, mais cela n'a pas suffit.

En outre, utiliser le système intégré de réécritures ("url rewrite", ce qui correspond à la table core_url_rewrite) est souvent pénalisant au niveau des performances quand on est dans des ordres de grandeur de dizaines de milliers d'enregistrements.

 

J'ai donc pensé qu'une solution élégante pour résoudre ce problème, avant ou après la transition, était de poser un hook au niveau du rendu de la page 404 de Magento, c'est-à-dire au moment où Magento va nous renvoyer la page CMS "Cette page n'existe pas gnagnagna".

À ce moment, et sans trop altérer le workflow de la plateforme, il nous suffit de consulter une table contenant des règles de redirections, et grâce à la fonction REGEXP de MySQL on peut éventuellement renvoyer une notification de redirection permanente au visiteur (et surtout au moteur de recherche !) afin qu'il aille tout seul à la nouvelle URL la prochaine fois pour obtenir la ressource demandée.

 

Dans l'exemple plus haut, il suffit de créer une règle avec le pattern suivant :

^/categorieA-.*\.html

et de définir le chemin cible suivant :

categorieA.html

pour rediriger simplement les visiteurs utilisant les anciennes URL vers la nouvelle catégorie.

On peut aussi à la place utiliser le chemin "système" afin de ne pas être dépendant des url-keys (la catégorie aurait l'ID 10) :

catalog/category/view/id/10

 

Chaque règle est associée à une boutique (store), possède un option de redirection (aucune, temporaire, permanente), et peut-être activée ou non.

 

Bien sûr, il s'agit d'un fonctionnement de fallback, et doit être utilisé comme tel. Il ne remplace pas le système de réécritures d'URL de Magento, ni les fonctionnalités de réécritures offertes par Apache (via .htaccess et vhost). Il vient uniquement en complément, et permet surtout à l'administrateur de gérer ses redirections lui-même depuis le back-office, d'en ajouter, d'en modifier, et d'en supprimer si besoin.

Il est nécessaire de savoir un peu ce qu'est une expression rationnelle, mais avec une petite documentation et un peu de support, même les plus hermétiques à la technique peuvent s'y mettre :)

[Magento] Réécritures de 404 par regexp

Le GitHub du module est disponible ici :

https://github.com/nanawel/Arrakis_404EverGone

En cas de bug ou problème, un petit ticket et j'y jetterai un oeil :)

 

Quelques captures d'écran de l'interface d'administration disponible dans le back-office ci-dessous.

Note : la traduction française est disponible, et sans fautes, ce qui est quand même à mentionner quand on connaît l'état du pack de traductions FR de Magento...

[Magento] Réécritures de 404 par regexp
[Magento] Réécritures de 404 par regexp[Magento] Réécritures de 404 par regexp
[Magento] Réécritures de 404 par regexp

Commenter cet article

Noobiduwéb 19/05/2015 08:43

Ca c'est pas mal, et à mon avis c'est monétisable. Je connais pas bien magento mais sous Prestashop (je sais quand on parle de Prestashop et Mangento on arrive souvent à des débats à la windows / mac) je vais peut être m'acheter un module similaire (pour ne pas à avoir à le coder moi même) so, si c'est pas natif sous magento, monter une petite boutique de vente de modules, en général c'est facilement monétisable ;)

Nanawel 19/05/2015 08:56

Merci, mais mon objectif ici n'est pas pécuniaire. Je suis salarié pour une agence spécialisée dans les développements Magento qui assure complètement mes revenus. De par mon contrat, tout ce que je produis peut être revendiqué par cette société, que ce soit dans ou en dehors des horaires de travail. À partir du moment où il n'y a pas de vente, il serait très difficile de faire reconnaître ces publications comme une faute professionnelle en cas de conflit avec mon employeur. Dans le cas inverse par contre, il s'agit d'une forme de concurrence...

Ici c'était très clairement car j'avais cette idée en tête depuis quelques temps et que je voulais voir si elle fonctionnait en pratique. Il s'avère que oui, mais je n'aurais jamais eu le temps de l'implémenter au boulot :)