# 03 — Breadcrumbs : aucun fil d'Ariane visible + JSON-LD cassé

> **Spec** : Breadcrumbs — tier **recommended**
> **Verdict** : 🔴 **FAIL** (et le JSON-LD existant pointe vers un 404) · **Priorité : P1**
> **Effort estimé** : 0,5-1 jour (un composant + correction du template JSON-LD)

## Problème

Double défaut :

1. **Aucun fil d'Ariane visible** sur aucune des 17 pages échantillonnées — pas de `<nav aria-label="Breadcrumb">`, pas de `<ol>` de trail. Le lien « Accueil » présent est la nav principale, pas un breadcrumb.
2. Le JSON-LD `BreadcrumbList` n'existe que sur **certains** templates (articles de blog, pages villes) et il est **cassé là où il existe** : sur les pages villes, le niveau 2 pointe vers une URL qui renvoie **404**.

## Preuves

BreadcrumbList émis par `/nid-guepes-frelons-yerres-91330` :

| Position | Nom | URL émise | Statut réel |
|---|---|---|---|
| 1 | Accueil | `https://www.abc-guepes.com` | 200 (mais sans le `/` final que le canonical de l'accueil utilise) |
| 2 | Essonne | `https://www.abc-guepes.com/91` | **404** — l'URL réelle est `/nid-guepes-frelons-essonne-91` |
| 3 | Yerres | `https://www.abc-guepes.com/nid-guepes-frelons-yerres-91330` | 200 ✓ |

- `BreadcrumbList` **absent** sur : accueil (normal), pages départements, `/presentation*`, `/tarifs`, `/contact`, `/galerie`.
- Présent sur : articles de blog, pages villes (mais cassé, cf. ci-dessus).

## Impact

- Le breadcrumb visible est le composant de maillage vertical le moins cher : il donne à chaque page ville un lien montant vers son département et l'accueil (synergie directe avec l'[issue 02](02-maillage-interne.md)).
- Google affiche le trail `BreadcrumbList` dans les SERP à la place de l'URL brute — mais un trail pointant vers un 404 sur **622 pages** est un signal d'incohérence, au mieux ignoré.
- La spec exige que le JSON-LD **reflète un élément visible** de la page — un BreadcrumbList sans UI correspondante est du markup fantôme.

## Correctif

1. **Corriger d'abord le JSON-LD existant** (quick win, 622 pages d'un coup via le template ville) :
   - Niveau 2 : `https://www.abc-guepes.com/91` → `https://www.abc-guepes.com/nid-guepes-frelons-essonne-91` (idem 77, 94, 89 — construire l'URL depuis les données de page, pas depuis le numéro de département).
   - Niveau 1 : `https://www.abc-guepes.com/` (aligné sur le canonical de l'accueil, avec slash).
2. **Créer un composant breadcrumb visible** et le poser sur tous les templates internes :
   ```html
   <nav aria-label="Fil d'Ariane">
     <ol>
       <li><a href="/">Accueil</a></li>
       <li><a href="/nid-guepes-frelons-essonne-91">Essonne (91)</a></li>
       <li aria-current="page">Yerres</li>
     </ol>
   </nav>
   ```
   Trails cibles :
   - Ville : `Accueil → <Département> → <Ville>`
   - Département : `Accueil → <Département>`
   - Article : `Accueil → Blog → <Article>`
   - Services/tarifs/contact : `Accueil → <Page>`
   Règles spec : dernier élément = page courante, **non cliquable**, `aria-current="page"` ; le trail reflète la hiérarchie, pas le chemin de navigation de l'utilisateur.
3. **Générer le JSON-LD depuis la même source de données que l'UI** (même tableau d'items → composant + `BreadcrumbList`), pour rendre toute divergence future impossible. Étendre aux templates qui n'en ont pas (départements, services, tarifs, contact).

## Vérification

- `curl -s <page-ville> | grep -o '"item":"[^"]*"'` → toutes les URLs répondent 200 (tester chaque niveau).
- [Test des résultats enrichis Google](https://search.google.com/test/rich-results) sur une page ville, un article, une page département : BreadcrumbList valide, 0 erreur.
- Contrôle visuel : le fil d'Ariane est rendu, dernier élément non cliquable.
