# Générer dynamiquement des balises hreflang pour des variantes régionales

> Une recette pour construire à la volée les balises hreflang d'un catalogue décliné par région, à partir des taxonomies déjà en place, sans extension dédiée.

- Auteur : WordPress Développement
- Publié le : 2022-08-12
- Mis à jour le : 2026-09-30
- Catégorie : Multilingue
- URL : https://www.wpmoderne.fr/multilingue/generer-hreflang-variantes-regionales/

## L’essentiel

- Une taxonomie région suffit à générer les balises sans extension
- wp_head accepte un simple boucle sur get_terms
- Les URLs doivent rester absolues et cohérentes

`get_terms( array( 'taxonomy' => 'region' ) )` : cette seule ligne suffit, une fois insérée dans le bon hook, à générer toutes les balises hreflang d'un catalogue décliné par région. Pas besoin d'extension de sitemap multilingue ni de plugin SEO supplémentaire quand la structure existe déjà sous forme de taxonomie.

Cette recette s'adresse à un cas précis : un catalogue de produits ou de contenus qui existe en plusieurs variantes régionales (France, Belgique, Suisse par exemple, ou des déclinaisons par pays hispanophone), rattachées à un même article via une taxonomie personnalisée `region`, sans que le site soit multilingue au sens de traductions Polylang ou WPML.

## Le contexte : une taxonomie région plutôt qu'une langue

Le cas visé ici diffère d'un site multilingue classique : le contenu reste en français, mais chaque article ou fiche produit possède des variantes rattachées à des régions différentes, avec des prix, des mentions légales ou des unités qui changent. Chaque variante est un article WordPress à part entière, relié aux autres par un champ personnalisé `variante_de` stockant l'identifiant de l'article pivot, et une taxonomie `region` avec les termes `fr`, `be`, `ch`.

Le balisage hreflang reste pertinent dans ce cas : il indique aux moteurs de recherche que ces pages sont des variantes régionales d'un même contenu, évitant qu'elles se fassent concurrence dans les résultats ou soient perçues comme du contenu dupliqué.

## La fonction qui génère les balises

La recette consiste à accrocher une fonction au hook `wp_head`, qui récupère les variantes liées à l'article courant et imprime une balise `link rel="alternate" hreflang` pour chacune.

> L'essentiel à retenir : Une taxonomie région suffit à générer les balises sans extension ; wp_head accepte un simple boucle sur get_terms ; Les URLs doivent rester absolues et cohérentes

```
add_action( 'wp_head', function () {
    if ( ! is_singular( 'fiche_produit' ) ) {
        return;
    }

    $current_id = get_the_ID();
    $pivot_id   = get_post_meta( $current_id, 'variante_de', true ) ?: $current_id;

    $variantes = get_posts( array(
        'post_type'      => 'fiche_produit',
        'meta_query'     => array(
            'relation' => 'OR',
            array( 'key' => 'variante_de', 'value' => $pivot_id ),
        ),
        'post__in'       => array( $pivot_id ),
        'posts_per_page' => -1,
    ) );

    foreach ( $variantes as $variante ) {
        $regions = get_the_terms( $variante->ID, 'region' );
        if ( empty( $regions ) || is_wp_error( $regions ) ) {
            continue;
        }
        foreach ( $regions as $region ) {
            printf(
                '<link rel="alternate" hreflang="%s" href="%s" /></link>' . "\n",
                esc_attr( 'fr-' . strtoupper( $region->slug ) ),
                esc_url( get_permalink( $variante->ID ) )
            );
        }
    }
} );
```

## Points d'attention sur le code de langue-région

Le code hreflang combine une langue ISO 639-1 et, facultativement, un pays ISO 3166-1 séparés par un tiret, par exemple `fr-BE` pour le français de Belgique. Il ne faut pas confondre ce code avec le slug de la taxonomie : dans l'exemple ci-dessus, le slug `be` devient `fr-BE` une fois mis en majuscules et préfixé, ce qui correspond au format attendu par les moteurs de recherche.

- Toujours utiliser des URLs absolues, jamais relatives, dans l'attribut `href`.
- Chaque variante doit aussi pointer vers elle-même : une page qui ne s'auto-référence pas dans son propre jeu de balises hreflang est une source d'erreurs fréquente.
- Prévoir un identifiant `x-default` pour la variante par défaut si le site en définit une.

## Éviter la boucle de requêtes coûteuses

Ce code s'exécute sur chaque page d'article de type `fiche_produit`, potentiellement affichée des milliers de fois par jour. Interroger la base à chaque chargement avec `get_posts()` est acceptable pour un catalogue de quelques centaines de références, mais devient sensible aux performances au-delà. La solution la plus simple consiste à mettre en cache le résultat par article pivot avec un objet transitoire.

```
$cache_key = 'hreflang_variantes_' . $pivot_id;
$variantes = get_transient( $cache_key );

if ( false === $variantes ) {
    $variantes = get_posts( /* ... même requête ... */ );
    set_transient( $cache_key, $variantes, HOUR_IN_SECONDS );
}
```

Le transitoire doit être invalidé à chaque modification d'une variante, via un hook `save_post_fiche_produit` qui supprime le transitoire correspondant au pivot concerné.

## Vérifier le résultat sans extension SEO

Sans extension SEO installée, il n'existe pas d'aperçu automatique des balises générées : la vérification se fait en consultant le code source de la page, ou en utilisant l'outil *Inspection d'URL* de Search Console une fois le site indexé. Une erreur fréquente à ce stade est l'oubli du symétrique : si la page France référence la page Belgique, la page Belgique doit référencer la page France en retour, sous peine que Google ignore la relation.

## En résumé

Générer des balises hreflang sans extension dédiée devient simple dès que la structure des variantes existe déjà sous forme de taxonomie ou de champ de liaison : une boucle sur `get_terms()` ou `get_posts()`, accrochée à `wp_head`, suffit largement pour un catalogue de taille modeste. Le soin doit surtout porter sur la réciprocité des balises et sur la mise en cache, deux points que les extensions dédiées gèrent automatiquement mais qu'il faut reconstruire soi-même ici.
