# Composer le slug des annonces immobilières avec la ville plutôt que le titre

> Une agence immobilière voulait un référencement local plus lisible. Le filtre wp_unique_post_slug permet de construire une URL fondée sur la ville et le type de bien plutôt que sur le titre libre.

- Auteur : Clément Hadrot
- Publié le : 2026-01-07
- Mis à jour le : 2026-01-07
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/slug-annonces-immobilieres-ville/

## L’essentiel

- Slug généré à partir de la ville et du type de bien, pas du titre
- Filtre appliqué uniquement sur le type de contenu concerné
- Gestion propre des doublons de ville sans suffixe numérique disgracieux

« annonce-t3-lumineux-avec-balcon » : voilà à quoi ressemblait, avant intervention, l'URL de la majorité des biens publiés par une agence immobilière indépendante installée en Bretagne. Un titre accrocheur pour le visiteur, mais une URL sans aucune valeur de référencement local, puisqu'aucune ville n'y apparaissait, alors même que l'essentiel du trafic recherché tenait à des requêtes du type « appartement à vendre Vannes ».

Le titre de l'annonce a une fonction commerciale, l'URL en a une autre, purement structurelle. Séparer les deux permet de composer un slug fondé sur la ville et le type de bien, sans jamais toucher à la liberté rédactionnelle du titre affiché. Voici comment j'ai construit ce mécanisme avec le filtre `wp_unique_post_slug`.

## Générer le slug à partir de deux champs personnalisés

Chaque annonce dispose de deux champs personnalisés : `ville_bien` et `type_bien` (appartement, maison, terrain). À l'enregistrement, si le slug n'a jamais été modifié manuellement, on le reconstruit systématiquement à partir de ces deux valeurs plutôt que du titre.

```
add_filter( 'wp_insert_post_data', function ( $data, $postarr ) {
    if ( 'annonce' !== $data['post_type'] ) {
        return $data;
    }

    $ville = get_post_meta( $postarr['ID'], 'ville_bien', true );
    $type  = get_post_meta( $postarr['ID'], 'type_bien', true );

    if ( $ville && $type && empty( $postarr['ch_slug_verrouille'] ) ) {
        $data['post_name'] = sanitize_title( $type . '-' . $ville . '-' . $postarr['ID'] );
    }

    return $data;
}, 10, 2 );
```

L'identifiant de l'annonce, ajouté en fin de slug, garantit l'unicité sans faire appel au suffixe numérique automatique de WordPress, souvent peu lisible (`-2`, `-3`) lorsqu'une même ville concentre plusieurs biens similaires.

> L'essentiel à retenir : Slug généré à partir de la ville et du type de bien, pas du titre ; Filtre appliqué uniquement sur le type de contenu concerné ; Gestion propre des doublons de ville sans suffixe numérique disgracieux

## Utiliser wp_unique_post_slug pour un contrôle plus fin

Le filtre précédent fonctionne à l'enregistrement, mais WordPress applique ensuite sa propre logique d'unicité via `wp_unique_post_slug`. Sur le type de contenu `annonce`, je le remplace intégralement pour garder la main sur la construction du suffixe, plutôt que de laisser WordPress ajouter un simple compteur.

```
add_filter( 'wp_unique_post_slug', function ( $slug, $post_id, $status, $post_type, $parent_id, $original_slug ) {
    if ( 'annonce' !== $post_type ) {
        return $slug;
    }

    // Le slug contient déjà l'identifiant du bien, il est unique par construction.
    return $original_slug;
}, 10, 6 );
```

Cette écriture peut surprendre : elle indique à WordPress que le slug d'origine est déjà unique, ce qui est vrai puisqu'il embarque l'identifiant du billet. Sans ce filtre, WordPress ajouterait quand même un suffixe supplémentaire par précaution, dégradant la lisibilité de l'URL sans raison.

## Traiter le cas des villes homonymes

Un point que l'agence a soulevé en cours de projet : certaines communes de moins de mille habitants portent le même nom que des villes plus connues dans d'autres départements. Le slug seul ne suffit donc pas à garantir la clarté pour l'utilisateur, même s'il reste techniquement unique grâce à l'identifiant.

- Le titre affiché continue de préciser le département entre parenthèses quand la ville est ambiguë, une information que le slug n'a pas besoin de porter.
- La donnée structurée `schema.org` de type `RealEstateListing` transmet la localisation complète aux moteurs de recherche, indépendamment de ce que contient l'URL.
- Le fil d'ariane du site rappelle systématiquement le département, ce qui règle l'ambiguïté pour le visiteur sans alourdir le slug.

## Un cas à part : le changement de ville après publication

Que se passe-t-il si une erreur de saisie sur la ville est corrigée après publication de l'annonce ? Par défaut, mon filtre ne reconstruit pas le slug de l'annonce en post-publication : le slug d'une annonce déjà publiée est considéré comme figé, afin de ne jamais casser un lien déjà partagé ou indexé.

```
add_filter( 'wp_insert_post_data', function ( $data, $postarr ) {
    if ( 'annonce' === $data['post_type'] && 'publish' === get_post_status( $postarr['ID'] ) ) {
        $data['post_name'] = get_post_field( 'post_name', $postarr['ID'] );
    }
    return $data;
}, 20, 2 );
```

Une correction de ville sur une annonce déjà en ligne se traite donc par une redirection 301 explicite plutôt que par une modification silencieuse du slug, une décision qui protège le référencement acquis sur l'URL initiale.

> Un bon slug immobilier se lit comme une réponse à une recherche : la ville et le type de bien avant tout, le reste est affaire de titre.

## Notre verdict

Reconstituer le slug à partir de deux champs de contexte plutôt que du titre libre a demandé moins de trente lignes de code, pour un gain de lisibilité d'URL immédiatement perceptible dans les résultats de recherche locaux. Ce chantier ne touche volontairement pas à la structure globale des permaliens du site, qui reste un sujet séparé, plus large et plus risqué à modifier a posteriori.
