Bonnes pratiques SEO
Sommaire
- Avant le go-live : Pré-requis techniques
- Structure & balisage HTML (articles de blog inclus)
- Métadonnées & Open Graph
- Données structurées (Schema.org / JSON-LD)
- Multilingue & hreflang
- Redirections & migration d'URL
- Performance & Core Web Vitals
- Indexation (robots.txt, sitemap, canonical)
- Checklist finale de mise en ligne
Cases à cocher persistantes
Coche les tâches au fil de ton projet et clique sur le libellé pour déplier le détail. L'état des cases est conservé pendant toute la durée de ta session de navigation (il se réinitialise à la fermeture du navigateur). Le bouton "Réinitialiser" remet la liste à zéro.
1. Avant le go-live
Avant le go-live0 / 0
2. Structure & balisage HTML
Règles de base sur chaque template
- Un seul
<h1>par page, correspondant au titre principal de contenu (pas le logo). - Hiérarchie stricte
h1 -> h2 -> h3sans saut de niveau. - Balises sémantiques HTML5 :
<header>,<nav>,<main>,<article>,<section>,<aside>,<footer>. - Navigation principale dans
<nav>avecaria-label. - Fil d'Ariane (breadcrumbs) balisé en JSON-LD (voir section 4).
Structure recommandée pour un article de blog
html
<article>
<header>
<h1>@Model.Title</h1> <!-- UNIQUE : titre de l'article -->
<p class="meta">
<time datetime="@Model.PublishDate.ToString("yyyy-MM-dd")">
@Model.PublishDate.ToString("dd MMMM yyyy")
</time>
- par <a rel="author" href="@authorUrl">@author.Name</a>
</p>
</header>
<p class="lead">@Model.Intro</p> <!-- chapô / résumé -->
<h2>Premier grand thème</h2> <!-- H2 = sections principales -->
<p>...</p>
<h3>Sous-point</h3> <!-- H3 = sous-sections du H2 -->
<p>...</p>
<h2>Deuxième grand thème</h2>
...
<footer>
<ul class="tags">...</ul>
</footer>
</article>Règles éditoriales pour le Rich Text Editor (TinyMCE / Block Editor)
- Retirer l'option
H1du RTE dansconfig/umbracoSettings.config(ou via Data Type), le H1 doit venir du template, pas du rédacteur. - Autoriser uniquement
h2,h3,h4,p,ul,ol,blockquote,a. - URL des images via
GetCropUrl()pour bénéficier du redimensionnement et du WebP natif.
Liens & ancres
- Liens internes avec libellés descriptifs (jamais "cliquez ici").
rel="noopener noreferrer"sur touttarget="_blank".rel="nofollow ugc"pour les liens utilisateurs/commentaires.
3. Métadonnées & Open Graph
Créer un Composition Umbraco SeoMetadata héritée par tous les Document Types :
| Propriété | Alias | Type | Règle |
|---|---|---|---|
| Meta Title | metaTitle | Textbox | 50-65 car. : fallback sur Name |
| Meta Description | metaDescription | Textarea | 140-155 car. : fallback sur intro |
| OG Image | ogImage | Media | 1200x630, < 300 Ko |
| Canonical override | canonicalUrl | Textbox | Optionnel |
| No-index | hideFromSearch | Boolean | Cascade aux enfants |
Template partiel _Meta.cshtml :
razor
@inherits UmbracoViewPage<IPublishedContent>
@{
var title = Model.Value<string>("metaTitle").IfNullOrEmpty(Model.Name);
var desc = Model.Value<string>("metaDescription");
var canonical = Model.Value<string>("canonicalUrl").IfNullOrEmpty(Model.Url(mode: UrlMode.Absolute));
var ogImg = Model.Value<IPublishedContent>("ogImage");
}
<title>@title</title>
<meta name="description" content="@desc" />
<link rel="canonical" href="@canonical" />
<meta property="og:type" content="website" />
<meta property="og:title" content="@title" />
<meta property="og:description" content="@desc" />
<meta property="og:url" content="@canonical" />
@if (ogImg != null)
{
<meta property="og:image" content="@ogImg.Url(mode: UrlMode.Absolute)" />
}
<meta name="twitter:card" content="summary_large_image" />4. Données structurées
Injecter du JSON-LD dans le <head> via un partial _StructuredData.cshtml.
Organization (site-wide, sur la home)
html
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Nom de l'entreprise",
"url": "https://www.exemple.ch",
"logo": "https://www.exemple.ch/logo.png",
"sameAs": ["https://www.linkedin.com/company/..."]
}
</script>BreadcrumbList (toutes les pages profondes)
razor
@{
var crumbs = Model.Ancestors().Reverse().Concat(new[]{ Model }).ToList();
}
<script type="application/ld+json">
{
"@@context":"https://schema.org",
"@@type":"BreadcrumbList",
"itemListElement":[
@for (int i = 0; i < crumbs.Count; i++)
{
@(i > 0 ? "," : "")
<text>{
"@@type":"ListItem",
"position":@(i+1),
"name":"@crumbs[i].Name",
"item":"@crumbs[i].Url(mode: UrlMode.Absolute)"
}</text>
}
]
}
</script>Article / BlogPosting (sur les articles de blog)
json
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Titre",
"image": ["https://..."],
"datePublished": "2026-04-14T08:00:00+02:00",
"dateModified": "2026-04-14T10:00:00+02:00",
"author": { "@type": "Person", "name": "..." },
"publisher": {
"@type": "Organization",
"name": "...",
"logo": { "@type": "ImageObject", "url": "https://.../logo.png" }
},
"mainEntityOfPage": "https://www.exemple.ch/blog/article"
}Autres types utiles selon le contenu : Product, FAQPage, LocalBusiness, Event, Recipe. Valider avec Rich Results Test.
5. Multilingue & hreflang
- Utiliser les Language Variants natifs d'Umbraco (Vary by Culture activé sur les Document Types concernés).
- Une URL distincte par culture :
/fr/...,/de/...,/en/...(ou sous-domaines selon choix). - Générer les balises
hreflangdans le<head>pour toutes les variantes publiées, y compris la page courante etx-default.
razor
@foreach (var culture in Model.Cultures)
{
var url = Model.Url(culture.Key, UrlMode.Absolute);
<link rel="alternate" hreflang="@culture.Key.ToLower()" href="@url" />
}
<link rel="alternate" hreflang="x-default" href="@Model.Url("fr-ch", UrlMode.Absolute)" />Règles :
- Codes ISO corrects :
fr-ch,de-ch,en(pasfr_CHniFR). - Réciprocité obligatoire : si A pointe vers B, B doit pointer vers A.
- Ne pas mélanger contenus traduits et contenus régionaux (duplicates).
6. Redirections & migration d'URL
Pendant la refonte
Migration d'URL0 / 0
Outils Umbraco
- URL Tracker natif (Umbraco 8+) : gère automatiquement les 301 quand un nœud est renommé ou déplacé. Vérifier que la table
UmbracoRedirectUrlest bien alimentée. - Skybrud.Umbraco.Redirects pour gérer les redirections manuelles via le back-office.
7. Performance & Core Web Vitals
Objectifs : LCP < 2.5 s, INP < 200 ms, CLS < 0.1.
Performance & Core Web Vitals0 / 0
8. Indexation
robots.txt (prod)
User-agent: *
Allow: /
Disallow: /umbraco/
Disallow: /umbraco/api/
Disallow: /install/
Sitemap: https://www.exemple.ch/sitemap.xmlSitemap XML & Canonical
Sitemap & canonical0 / 0
9. Checklist finale (jour du go-live)
Jour du go-live0 / 0

