# Filtrer les artisans visibles selon le code postal saisi par le visiteur

> Un annuaire d'artisans cherchait une pertinence locale sans géolocalisation automatique. Un simple champ de code postal, saisi par le visiteur, filtre désormais les fiches affichées sans complexité technique superflue.

- Auteur : WordPress Développement
- Publié le : 2023-02-25
- Mis à jour le : 2023-02-25
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/filtrer-artisans-code-postal-annuaire/

## L’essentiel

- Le filtre repose sur une correspondance de préfixe de code postal, pas une distance
- Aucune autorisation de géolocalisation demandée au visiteur
- Le champ reste dans l'URL pour permettre le partage d'une recherche

75, 92, 93 : trois débuts de code postal suffisent parfois à définir un bassin de vie plus précisément qu'un calcul de distance à vol d'oiseau. C'est le constat qu'a fait un annuaire d'artisans du bâtiment en région parisienne, en cherchant une solution de filtrage local sans vouloir demander l'autorisation de géolocalisation à ses visiteurs, une demande souvent perçue comme intrusive pour une simple recherche d'artisan.

La solution retenue reste volontairement simple : un champ de saisie où le visiteur indique son code postal, comparé au préfixe des codes postaux couverts par chaque artisan. Aucune base cartographique, aucun calcul de distance, seulement une correspondance textuelle qui suffit largement à l'usage recherché.

## Stocker les zones couvertes par préfixe

Chaque fiche artisan porte un champ personnalisé `zones_couvertes`, une liste de préfixes de code postal séparés par des virgules, par exemple `75,92,93` pour un artisan qui intervient sur Paris et sa proche banlieue nord et ouest.

```
function ch_artisan_couvre_code_postal( $artisan_id, $code_postal_saisi ) {
    $zones = get_post_meta( $artisan_id, 'zones_couvertes', true );
    if ( ! $zones ) {
        return false;
    }

    $prefixes = array_map( 'trim', explode( ',', $zones ) );
    $prefixe_saisi = substr( $code_postal_saisi, 0, 2 );

    return in_array( $prefixe_saisi, $prefixes, true );
}
```

> L'essentiel à retenir : Le filtre repose sur une correspondance de préfixe de code postal, pas une distance ; Aucune autorisation de géolocalisation demandée au visiteur ; Le champ reste dans l'URL pour permettre le partage d'une recherche

## Filtrer la liste des artisans à partir du formulaire

Le formulaire de recherche envoie le code postal en paramètre d'URL, ce qui permet à un visiteur de partager ou d'enregistrer en favori une recherche déjà filtrée. La requête `WP_Query` récupère l'ensemble des artisans publiés, puis le filtrage par préfixe s'applique en dehors de la requête elle-même, sur le tableau de résultats obtenu.

```
$code_postal = isset( $_GET['code_postal'] ) ? sanitize_text_field( $_GET['code_postal'] ) : '';

$artisans = new WP_Query( array(
    'post_type'      => 'artisan',
    'post_status'    => 'publish',
    'posts_per_page' => -1,
) );

$resultats = array();

if ( $code_postal ) {
    foreach ( $artisans->posts as $artisan ) {
        if ( ch_artisan_couvre_code_postal( $artisan->ID, $code_postal ) ) {
            $resultats[] = $artisan;
        }
    }
} else {
    $resultats = $artisans->posts;
}
```

## Pourquoi un filtrage en mémoire plutôt qu'une meta_query

Une `meta_query` classique avec `LIKE` sur le champ `zones_couvertes` aurait semblé plus directe, mais elle produit des faux positifs dès qu'un préfixe de deux chiffres apparaît comme sous-chaîne d'un autre : rechercher `75` retournerait aussi les artisans couvrant `750` par erreur d'interprétation de la comparaison textuelle brute. Le filtrage en mémoire, sur un tableau explicitement découpé par virgule, évite ce piège au prix d'un léger surcoût de traitement, largement négligeable pour un annuaire de quelques centaines de fiches.

```
// À éviter : produit des faux positifs sur les préfixes imbriqués
$artisans = new WP_Query( array(
    'post_type'  => 'artisan',
    'meta_query' => array(
        array( 'key' => 'zones_couvertes', 'value' => $code_postal, 'compare' => 'LIKE' ),
    ),
) );
```

## Afficher un message clair en l'absence de résultat

Un annuaire local doit assumer qu'une recherche par code postal peut légitimement ne renvoyer aucun artisan, en particulier dans une zone peu couverte. Plutôt qu'une page vide, un message invite à élargir la recherche ou à contacter l'annuaire directement.

- Un message qui rappelle le code postal recherché, pour que le visiteur comprenne immédiatement pourquoi la liste est vide.
- Un lien pour retirer le filtre et afficher l'ensemble des artisans référencés, sans perdre le contexte de la recherche initiale.
- Un formulaire de contact proposé en alternative, pour transformer une recherche infructueuse en opportunité de mise en relation manuelle.

> Un filtre par préfixe de code postal règle l'essentiel des recherches locales, sans jamais demander au visiteur une autorisation qu'il n'a pas envie d'accorder pour une simple consultation d'annuaire.

## En résumé

Ce filtrage ne traite volontairement pas le calcul de distance à vol d'oiseau entre le visiteur et l'artisan, une fonctionnalité plus complexe qui suppose une base de coordonnées géographiques et une bibliothèque de calcul dédiée. Pour cet annuaire, la correspondance par préfixe de code postal a suffi à répondre à l'attente réelle des visiteurs, avec une implémentation tenant en quelques dizaines de lignes.
