Régler les métas SEO des catégories depuis un CSV
cafe_seotitlebycsv · v2.0.0 · AGPL-3.0-or-later
Reportez les titres et descriptions SEO de vos catégories depuis un tableur. Le module montre ce qu'il changerait avant d'écrire, et ne vide jamais un champ que votre fichier ne remplit pas — une colonne absente laisse la métadonnée en place.
Ce que ce module fait, et ce qu'il refuse
- ✓Il ne vide JAMAIS un champ : une colonne absente du fichier, ou une cellule laissée vide, laisse la métadonnée en place. La version 1.0.0 écrivait une chaîne vide et effaçait le titre SEO — mesuré
- ✓L'essai à blanc est actif par défaut : il affiche, catégorie par catégorie, le titre actuel barré et le nouveau en dessous, et n'écrit rien
- ✓La langue se choisit dans un écran, parmi celles installées — elle n'est plus celle de l'employé connecté. Une colonne id_lang du fichier la règle ligne par ligne
- ✓Les autres langues ne sont pas touchées, et en multiboutique les autres boutiques non plus : la 1.0.0 écrivait sans id_shop et écrasait toutes les boutiques à la fois — mesuré
- ✓Un refus porte sur une ligne, pas sur le fichier : l'import va au bout sans elle et le rapport nomme son numéro de ligne et son motif
- ✓Un titre trop long est refusé AVANT que MySQL ne le tronque, avec sa longueur en caractères — 255 pour le titre, 512 pour la description
- ✓Le séparateur est détecté — point-virgule, virgule, tabulation ou barre verticale — et le CSV UTF-8 de votre tableur convient tel quel, marque d'octets comprise
- ✓Les colonnes se nomment dans l'en-tête et l'ordre n'a pas d'importance ; un fichier sans en-tête reste lu dans l'ordre historique
- ✓Une catégorie qui n'existe pas est signalée comme non écrite : un UPDATE sur zéro ligne réussit sans rien faire, et ce n'est pas un succès
- ✓Deux lignes pour la même cible : la dernière vaut, et le rapport nomme la ligne remplacée
- ✓Chaque valeur écrite passe par pSQL : Db::update interpole les valeurs telles quelles, rien n'échappe à votre place
- ✓Les caches de catégorie et de gabarits sont purgés après écriture — sans quoi vos pages continueraient d'être servies avec les anciennes métadonnées
- ✓Aucun contrôleur, aucun greffon, aucune table, aucune clé de configuration : la désinstallation ne laisse rien
- ✓80 vérifications de décision et 16 mutations livrées avec le module, rejouables sans PHPUnit ni boutique, plus 43 preuves de comportement sur de vraies catégories
Le problème
Vous avez deux cents catégories, et un tableur où vous avez enfin écrit les titres et les descriptions SEO qui vont bien. Il faut maintenant les reporter une par une dans le back-office, onglet SEO, catégorie après catégorie.
Et si vous avez déjà essayé de le faire en masse, vous connaissez la peur qui va avec : un import qui se trompe sur vos métadonnées ne les abîme pas, il les efface. Le travail de référencement de six mois tient dans deux colonnes de base de données qui ne gardent aucun historique.
Comment ça marche
Les colonnes se nomment, et l'ordre n'a pas d'importance :
id_category;meta_title;meta_description
12;Turbos reconditionnés garantis 2 ans;Nos turbos révisés sur banc, livrés en 48 h
13;Injecteurs diesel toutes marques;Injecteurs testés, garantie pièce et main-d'œuvre
Vous pouvez n'en remplir qu'une :
id_category;meta_title
14;Pompes haute pression révisées
Le séparateur est détecté : point-virgule, virgule, tabulation ou barre verticale. Le fichier que votre tableur vient de produire convient tel quel, y compris en « CSV UTF-8 » avec sa marque d'octets invisible.
| Colonne | Rôle |
|---|---|
id_category | obligatoire, un entier strictement positif |
meta_title | facultative, 255 caractères au plus |
meta_description | facultative, 512 caractères au plus |
id_lang | facultative, pour régler la langue ligne par ligne |
Il ne vide jamais un champ
C'est la règle du module, et elle n'a pas d'exception.
Une colonne que vous ne mettez pas dans le fichier laisse la métadonnée en place. Une cellule que vous laissez vide, aussi. Et une ligne qui ne demande ni titre ni description est refusée plutôt qu'appliquée comme un effacement.
Pour vider une métadonnée, passez par la fiche de la catégorie : c'est un geste qui se fait une fois, en la regardant, pas en masse depuis un tableur.
L'essai à blanc est actif par défaut
Sur un module qui écrit dans votre référencement, le premier geste ne doit pas être celui qui écrit.
L'essai à blanc lit le fichier et affiche, catégorie par catégorie, le titre actuel barré et le nouveau en dessous. Ce qui ne change pas est marqué comme inchangé. Et rien n'est écrit.
La langue, vous la choisissez
Un écran vous demande dans quelle langue écrire, parmi celles installées sur la boutique. Elle est pré-remplie avec la vôtre, mais vous la voyez avant de valider.
Si votre fichier porte une colonne id_lang, c'est elle qui décide, ligne par ligne : un seul fichier peut donc régler le français et l'anglais d'une même catégorie.
Les autres langues ne sont pas touchées. En multiboutique, les autres boutiques non plus.
Ce qu'il refuse, et pourquoi
Un refus porte sur une ligne, pas sur le fichier : l'import va au bout sans elle, et le rapport nomme son numéro de ligne et son motif.
| Ligne | Ce qui se passe |
|---|---|
12 seule | refusée. Elle ne demande ni titre ni description — et elle n'efface pas les deux. |
REF-7;Mon titre | refusée. Ce module travaille sur les identifiants de catégorie. |
12 produits;Mon titre | refusée. Cela ne vaut pas la catégorie 12. |
| un titre de 256 caractères | refusée, avec sa longueur. La colonne en accepte 255, et une phrase coupée en deux dans Google n'est pas un résultat. |
un titre portant <, >, { ou } | refusée. PrestaShop les refuse aussi, mais plus loin — autant le dire tout de suite. |
12;Premier jet puis 12;Titre corrigé | la dernière vaut, et le rapport nomme la ligne remplacée. |
| une catégorie qui n'existe pas | signalée comme non écrite. Un UPDATE sur zéro ligne réussit sans rien faire : ce n'est pas un succès. |
Ce qui a été mesuré
Le module est livré avec ses deux jeux d'épreuves, rejouables sans PHPUnit et sans boutique pour le premier :
- 80 vérifications sur la décision — ce qu'un fichier demande, avant toute
écriture — et 16 mutations jouées, dont 16 rougissent. Une décision qu'aucune épreuve ne garde est une décision qui se perdra à la prochaine retouche.
- 43 preuves de comportement sur de vraies catégories, en PrestaShop 9.0.3 et
PHP 8.4.15 : l'effacement est mesuré sur la version précédente, puis le refus sur la même ligne ; la séparation des langues est vérifiée sur deux langues installées ; un titre de 255 caractères accentués est relu entier.
Deux de ces mutations ont dit ce que la relecture ne voyait pas. C'est leur intérêt.
Ce qu'il ne fait pas
- Il ne touche que les catégories. Les produits et les pages ont leurs
propres métadonnées, et un autre module.
- Il n'écrit aucune table, ne pose aucun greffon, ne garde aucune clé
de configuration. La désinstallation ne laisse rien derrière elle.
- Il n'a aucun contrôleur, ni public ni d'administration. Son seul point
d'entrée est sa page « Configurer », derrière votre session employé et le jeton du back-office. Il n'y a rien à atteindre de l'extérieur.
Si vous veniez de la version 1.0.0
Montez, puis relisez vos métadonnées sur quelques catégories.
La 1.0.0 effaçait dès qu'une ligne de votre fichier avait moins de trois colonnes, et elle ne le disait pas. La 2.0.0 ne peut pas réparer cela : la table ne garde pas d'historique, et rien ne dit ce qu'il y avait avant. Vos recours sont une sauvegarde de base antérieure, ou ce que l'index de Google garde encore de vos anciens titres.
Ce qui est écrit noir sur blanc dans le fichier de montée du module, plutôt que découvert plus tard.
Ce que la licence exige de vous
Ce module est sous AGPL-3.0-or-later. Installé sans modification, vous n'avez rien à publier. Modifié et servi à vos visiteurs, vous devez leur offrir la source de ce module modifié — jamais celle de votre boutique, de votre thème, ni du cœur de PrestaShop. Le fichier NOTICE de l'archive porte les attributions exactes.
Le module est gratuit. Une adresse e-mail suffit.
Sans compte à créer, et la lettre d'information reste facultative.