# Limiter l’affichage d’une offre à un rayon avec un champ zone de chalandise

> Comment éviter qu'un artisan reçoive des demandes venues de l'autre bout du pays ? En filtrant l'affichage de ses offres selon un rayon calculé depuis un code postal.

- Auteur : Clément Hadrot
- Publié le : 2026-02-19
- Mis à jour le : 2026-02-19
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/limiter-affichage-offre-rayon-zone-chalandise/

## L’essentiel

- Rayon calculé depuis deux codes postaux, sans coordonnées GPS précises
- Affichage conditionnel selon la localisation déclarée du visiteur
- Message clair en dehors de la zone couverte

Faut-il vraiment un système de géolocalisation précis pour savoir qu'un artisan basé à Chartres ne va pas se déplacer jusqu'à Bordeaux ? Dans la grande majorité des cas, un simple rapprochement entre deux codes postaux suffit largement, sans jamais demander l'accès à la position GPS du visiteur.

Un artisan qui ne veut pas recevoir de demandes hors de sa zone d'intervention réelle a besoin d'un filtrage approximatif mais fiable, basé sur une distance estimée entre le code postal de son entreprise et celui renseigné par le visiteur dans un champ de recherche.

## Le principe : un rayon, pas des coordonnées précises

Contrairement à une géolocalisation GPS qui nécessite l'autorisation du navigateur, un filtrage par code postal ne demande qu'une saisie manuelle de cinq chiffres, ce que la plupart des visiteurs acceptent sans réticence, contrairement à un partage de position exacte perçu comme intrusif.

## Convertir un code postal en distance approximative

> L'essentiel à retenir : Rayon calculé depuis deux codes postaux, sans coordonnées GPS précises ; Affichage conditionnel selon la localisation déclarée du visiteur ; Message clair en dehors de la zone couverte

Une table de correspondance entre codes postaux et coordonnées géographiques (latitude, longitude), stockée localement au format JSON, évite de dépendre d'un service externe payant pour un simple calcul de distance à vol d'oiseau.

```
function distance_entre_codes_postaux( $cp_artisan, $cp_visiteur, $table_coords ) {
    if ( ! isset( $table_coords[ $cp_artisan ], $table_coords[ $cp_visiteur ] ) ) {
        return null;
    }

    $a = $table_coords[ $cp_artisan ];
    $b = $table_coords[ $cp_visiteur ];

    $rayon_terre = 6371;
    $delta_lat   = deg2rad( $b['lat'] - $a['lat'] );
    $delta_lng   = deg2rad( $b['lng'] - $a['lng'] );

    $formule = sin( $delta_lat / 2 ) ** 2
        + cos( deg2rad( $a['lat'] ) ) * cos( deg2rad( $b['lat'] ) )
        * sin( $delta_lng / 2 ) ** 2;

    return $rayon_terre * 2 * atan2( sqrt( $formule ), sqrt( 1 - $formule ) );
}
```

Cette formule, dite de haversine, reste une approximation à quelques kilomètres près, largement suffisante pour un filtrage de zone d'intervention où l'objectif est d'éviter les demandes manifestement hors zone, pas de calculer un itinéraire précis.

## Appliquer le filtre à l'affichage des offres

Le champ personnalisé « code postal » de la fiche artisan, comparé au code postal saisi par le visiteur dans un champ de recherche, permet d'exclure les offres dont la distance calculée dépasse le rayon d'intervention déclaré.

```
$rayon_max = (int) get_field( 'rayon_intervention_km', $post_id );
$distance  = distance_entre_codes_postaux( $cp_artisan, $cp_saisi, $table_coords );

$offre_visible = ( $distance !== null && $distance
```

## Que faire hors de la zone couverte

- Masquer complètement l'offre plutôt que l'afficher grisée, pour éviter la frustration
- Proposer un message explicite : « Cet artisan intervient dans un rayon de X km »
- Suggérer d'autres artisans du même corps de métier plus proches, si le catalogue le permet

### Un rayon personnalisable par artisan

Certains artisans acceptent de se déplacer plus loin pour un chantier important, d'autres restreignent volontairement leur zone. Le champ `rayon_intervention_km` doit rester éditable individuellement plutôt que fixé globalement pour l'ensemble du catalogue.

> Un filtre de zone trop strict fait perdre des demandes légitimes en bordure de rayon ; mieux vaut prévoir une marge de tolérance de quelques kilomètres plutôt qu'une coupure nette.

## Limites de l'approche par code postal

Deux communes limitrophes peuvent partager des codes postaux très différents en apparence, ou au contraire un même code postal peut couvrir une zone rurale étendue sur plusieurs dizaines de kilomètres. Le calcul reste donc une estimation, pas une mesure de trajet réel, ce qui doit être clairement assumé dans la communication faite à l'artisan.

## En résumé

Un calcul de distance approximative entre deux codes postaux, sans jamais recourir à la géolocalisation précise du visiteur, suffit à filtrer efficacement l'affichage des offres selon une zone de chalandise réaliste. La géolocalisation fine du visiteur, elle, reste un sujet distinct, avec ses propres enjeux de consentement et de précision.
