Stratégie d’Architecture SEO pour le ecommerce
Qui suis-je ?
Bruno vial
10+ xp en SEO (ciblo, iProspect, cruiseline.eu)
Focus technical : data, programmation
Ex SEO, Actuellement consultant digital & data chez converteo
@zenobral sur twitter
J’écris parfois sur le blog de madeline pinthon (@razbithume) : http://www.canyouseome.com/
Qu’est ce qu’un site bien architecturé ?
Les vraies difficultés arrivent car le site vit
Et l’enfer, c’est les autres
On va tout migrer en Août sur MongoDB, tous les urls vont changer. C’est le meilleur moment il n’y a personne
Freddy CTO
On a réorganisé toutes les catégories du site, parce que l’internaute n’y comprenait rien. Si j’ai regardé les stats de nav sur GA ? Il y a ça dedans ?
Jason UX
On a renommé tous les titres des guides et des produits pendant tes vacances. Si les URLs ont changé ? C’est quoi un URL ?
Reine (alien) de l’édito
On se parle de quoi ?
Patterns d’urls
Pourquoi se soucier du format des urls ?
Pour placer des keywords dans l’url ? -> NON !
Plutôt pour :
Ce qu’on retrouve couramment
Produit ou catégorie ?
/homme/chaussures/adidas-predator
duplicate ?
/homme/chaussures/adidas-predator
/adidas/chaussures/adidas-predator
C’est bien le même contenu dans deux langues différentes ? Comment faire le matching automatiquement quand j’analyse ? Et mon hreflang il est bon ou pas ?
site.fr/homme/chaussures/adidas-predator
site.it/uomo/scarpe/adidas-predator
Mais c’est qui lui ? un doublon ?
/homme/chaussures/addidas-predator
Et lui ?
/homme/chaussures/adidas-predator-2
Tu l’as voulu ? tu l’as eu !
Ton idée de départ
Ton site
Idée générale sur le format des urls
Rester au plus proche des concepts imposés par le framework du site
L’URL devrait illustrer au plus proche :
Framework mvc
Avec un produit c’est plus clair ?
Url Produit
Template de la page produit
Entrée produit dans la database
La database doit probablement ressembler à ceci
Id | nale | desc | category id | brand id |
| | | | |
| | | | |
| | | | |
Id | name | desc |
| | |
| | |
| | |
Id | name | desc |
| | |
| | |
| | |
table produit
table marque
table catégorie
Id | name | desc | text |
| | | |
| | | |
| | | |
table éditos
Keep it simple: un exemple de format
Id | name | desc | category id | brand id |
5 | adidas predator | | | |
| | | | |
| | | | |
table produit
url
Et ca donne ?
L’indicateur de table peut être réduit au minimum
Idéal pour le multilingue, car on s’épargne la traduction de la correspondance de la route/contrôleur
Avec variante multilingue
Id | category id | lang | name | desc |
1 | 4 | fr | chaussures home | |
2 | 4 | it | scarpe uomo | |
| | | | |
table catégorie langue
Id | internal name |
4 | chaussures homme |
| |
| |
table categorie
site.fr/c-4-chaussures-homme
site.it/c-4-scarpe-uomo
Qu’est ce que j’y gagne ?
Produit ou catégorie ? → produit
/p-5-adidas-predator
duplicate ? → oui
/c-4-homme/c-7-chaussures/p-5-adidas-predator
/m-7-adidas/c-7-chaussures/p-5-adidas-predator
Et mon hreflang il est bon ou pas ? → tout bon gaston
site.fr/c-4-homme/c-7-chaussures/p-4-adidas-predator
site.it/c-4-uomo/c-7-scarpe/p-4-adidas-predator
Mais c’est qui lui ? un doublon ? → oui
/c-4-homme/c-7-chaussures/p-4-addidas-predator
Et lui ? → non
/c-4-homme/c-7-chaussures/p-35-adidas-predator-2
Duplication liée à l’arborescence
Je n’utilise jamais de folders dans l’url pour représenter l’arborescence dans le site
Eliminez l’arbo du site dans l’url !
/c-4-homme/c-7-chaussures/p-5-adidas-predator → /p-5-adidas-predator
/m-7-adidas/c-7-chaussures/p-5-adidas-predator → /p-5-adidas-predator
Aussi simple que ca !
Des fois, d’autres s’en mêlent….
Mais on a besoin de l’arbo dans l’url pour analyser les performances du contenu !
Faites réaliser une vraie configuration dans Google Analytics pour analyser les contenus… l’outil est fait pour ca
(c’est moi)
Génération et lecture
Id | name | desc | category id | brand id |
5 | adidas predator | | | |
table produit
url
Quand le site “génère” l’url, il va utiliser les trois informations : table, id slug
En revanche, quand on “demande” l’url depuis le navigateur, seules les informations de table et d’id sont importantes pour retrouver l’entrée.
Le slug est purement décoratif !
Id | name | desc | category id | brand id |
5 | adidas predator | | | |
table produit
url
générer
lire
Changement de slug et redirection auto
Avec ce pattern d’url il est TRES SIMPLE de gérer les redirections automatique en cas de changement de slug
request url
does request url match generated url ?
return page
301 to generated url
yes
no
Et la vie est plus belle
On a changé tous les titres des éditos. Il faut peut être que fasses une repasse globale sur les urls ! (j’ai appris entre temps)
Tout est géré automatiquement. Bon, je te rappelle je suis au bar
(c’est encore moi)
Du coup les urls restent toujours “flats” ?
Pas forcément, mais la constitution de l’url ne devrait pas dépendre de la manière dont les pages sont rattachées les unes aux autres “éditorialement”.
Pensez par exemple à des “liseuses”
On peut les rattacher à un univers “livres”?
→ /u-5-livres/c-18-liseuses
Mais pourquoi pas un univers “tablettes” ?
-> /u-23-tablettes/c-18-liseuses
La règle du sous ensemble
My Rule : Je peux mettre un répertoire dans l’URL dès que je recense des éléments qui sont un sous ensemble de l’élément parent.
Vous avez dit facettes ?
Croisement avec une autre table
Si vous avez déjà des entrées pour chacune des tables pour le site, alors représentez l'intersection avec la même nomenclature
m-5-adidas
c-12-baskets
/c-12-baskets/m-5-adidas
Sélection sur un critère
Si c’est simplement un critère, il faut “inventer” une “route-slug” et s’y tenir
m-4-adidas
WHERE promo=True
/m-4-adidas/promotion
On retombe sur de la duplication de contenu ?
Il est courant que l’on puisse descendre par différents parcours sur le site.
Les parcours “marque->catégorie” et “catégorie -> marque” sont hyper classiques
On aboutit à des trucs non désirables comme ca :
/m-5-adidas
/c-12-baskets
/m-5-adidas/c-12-baskets
/c-12-baskets/m-5-adidas
/c-12-baskets
/m-5-adidas
Solution : ordonnancement des routes
Définissez en amont un ordre des routes qui définira comment elles doivent se chevaucher si elles se croisent. Cela peut être simplement alphabétique, ou stocké dans une table
Résolution des intersections
Il suffit ensuite de faire la spec au dev pour qu’il respecte l’ordre des routes lors des croisements
No more duplicates !
/m-5-adidas
/c-12-baskets
/c-12-baskets/m-5-adidas
/c-12-baskets
/m-5-adidas
Et on peut dormir tranquille
On a refait toute l’arborescence des catégories pendant tes vacances, il parait qu’il vaut mieux lancer un crawl? (j’ai fait des progrès en seo)
Les catégories ne sont pas liées les unes aux autres dans les urls. Normalement, rien ne doit avoir bougé. Je te laisse, je finis ma bière
Ah non merde on l’avait oublié
Bon la migration c’est le 17 Août, c’est ok de ton côté ?
Je te montre un truc
Gérer une migration avec ces formats
Lors d’une migration de site, on a tendance généralement à conserver les mêmes typologies de pages
Le vrai “risque” est que les ids changent, car changement de base de données.
Toutefois les développeurs font (quasi) systématiquement un import automatique, et il est relativement simple de conserver une table de référence “ancien id <-> nouvel id”
Là encore l’id dans l’url est votre ami !
Les redirections avec apache: rewritemap
Apache possède une fonctionnalité appelée rewritemap : https://httpd.apache.org/docs/2.4/fr/rewrite/rewritemap.html
Il suffit pour chaque typologie de page de créer une map de correspondance d’ids:
rewriterules
Le fichier de conf (htaccess ou vhost) devra ensuite posséder une rewriterule pour chaque typologie d’url
Cela parait barbare, mais c’est en réalité très simple pour la personne dont c’est le métier et peu prompt à erreurs
Normalement c’est tranquille
C’est bon, j’ai lu la doc, c’est easy pour nous. Tu payes ta bière après ?
Lets go !
Cryptage de liens
Différencier cryptage et cloaking
Cloaking
Cryptage
Crypter ou robots.txt
Robots.txt
Pour :
Contre :
Cryptage
Pour :
Contre :
Comment fonctionne (basiquement) ggbot ?
En temps 2 :
Pas de lien pour google
Google n’est pas capable de “deviner” des actions utilisateur à réaliser
Donc si on veut cacher un lien :
html element styled as link
click
function(){
document.location.href= …
}
Level 1 : Version simple
<span data-content=”aHR0cHM6Ly93d3cuc2VvZ29vZHZpYmVzLmNvbS8=” data-crypted>anchor text</span>
base64 encoded url
Level 2 : more control
Si on se base sur le format d’url précédemment appris, on peut générer un url à partir des attributs définis dans le html du <span>
<span
data-controler=”p”
data-id=”7”
data-slug=”polo-blanc”
data-crypted
>anchor</span>
Level 3+ : imagination is your limit
Des sites utilisent des systèmes complexe avec récupération du contexte du lien, de la page, postent les infos vers une API qui répond avec le contenu.
Cdiscount, par exemple, utilise simplement une méthode “updateJsonPage” pour gérer les facettes non désirées (pas forcément dédiée qu’aux facettes)
Au sein d’un même groupe de filtre (marque par ex) , on a tantôt un vrai lien, tantôt un <span>
To study : https://www.cdiscount.com/bricolage/outillage/outillage-electroportatif/ponceuse/l-166010103.html
La décoration de lien
Lien original
/c-32-pantalon
Lien décoré
/c-32-pantalon?param=value
Ne perdez pas de temps à crypter n’importe quoi
Le “nous contacter” dans le Footer !!
Cela ne sert à rien !!
(Voir les formations des frères Peyronnet sur le surfer raisonnable)
On crypte les facettes inutiles
Les facettes mal utilisées sont un gaspillage énorme de crawl et PageRank interne.
Posez vous la question :
Le bon taux d’ouverture dépend essentiellement de la popularité de votre site.
Si tout est fermé ouvrez doucement… et inversement
Checkez vos logs et vos statistiques de visite
Les facettes mériteraient une présentation à part
La pagination...
Le méga menu ?
On décore les liens contextualisant un produit
L’ux impose parfois d’ouvrir un produit dans un certain contexte :
On gère cela de cette manière :
Le mot de la fin
NB : j’aime les UX, les Editos, et surtout les Devs qui sont toujours mes potes
Merci !
Des questions ?