Skip to content

Bonnes pratiques SEO


Sommaire

  1. Avant le go-live : Pré-requis techniques
  2. Structure & balisage HTML (articles de blog inclus)
  3. Métadonnées & Open Graph
  4. Données structurées (Schema.org / JSON-LD)
  5. Multilingue & hreflang
  6. Redirections & migration d'URL
  7. Performance & Core Web Vitals
  8. Indexation (robots.txt, sitemap, canonical)
  9. 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 -> h3 sans saut de niveau.
  • Balises sémantiques HTML5 : <header>, <nav>, <main>, <article>, <section>, <aside>, <footer>.
  • Navigation principale dans <nav> avec aria-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 H1 du RTE dans config/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 tout target="_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éAliasTypeRègle
Meta TitlemetaTitleTextbox50-65 car. : fallback sur Name
Meta DescriptionmetaDescriptionTextarea140-155 car. : fallback sur intro
OG ImageogImageMedia1200x630, < 300 Ko
Canonical overridecanonicalUrlTextboxOptionnel
No-indexhideFromSearchBooleanCascade 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>
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 hreflang dans le <head> pour toutes les variantes publiées, y compris la page courante et x-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 (pas fr_CH ni FR).
  • 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 UmbracoRedirectUrl est 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.xml

Sitemap XML & Canonical

Sitemap & canonical0 / 0

9. Checklist finale (jour du go-live)

Jour du go-live0 / 0

Contributors

The avatar of contributor named as Clément Favre Clément Favre

Changelog