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 );
}

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.