# Désindexer un annuaire juridique avec le filtre pre_get_posts

> Masquer les profils d'avocats non vérifiés d'un annuaire sans les supprimer : marche à suivre avec pre_get_posts et une balise noindex conditionnelle.

- Auteur : WordPress Développement
- Publié le : 2022-06-13
- Mis à jour le : 2022-06-13
- Catégorie : SEO &amp; GEO
- URL : https://www.wpmoderne.fr/seo/desindexer-annuaire-juridique-pre-get-posts/

## L’essentiel

- Un statut de vérification distinct du statut de publication
- Exclusion des requêtes publiques via pre_get_posts
- Balise noindex tant que le profil n'est pas validé

`pre_get_posts` est le hook qui intercepte une requête WordPress avant qu'elle ne touche la base de données, et c'est exactement l'outil qu'il fallait pour résoudre un problème précis sur un annuaire professionnel d'avocats : des centaines de profils créés par inscription libre, jamais vérifiés par un modérateur, se retrouvaient indexés au même titre que les profils validés.

L'enjeu n'était pas de supprimer ces fiches, certaines finissant par être validées quelques jours plus tard, mais de les retirer temporairement de la circulation publique et de l'indexation tant qu'un humain n'avait pas confirmé l'identité du professionnel concerné.

## Étape 1 : créer un statut de vérification indépendant

La première tentative, consistant à passer les profils non vérifiés en brouillon, posait un problème : un brouillon n'apparaît dans aucune requête d'administration filtrée sur le statut publié, ce qui compliquait le travail des modérateurs qui avaient besoin de voir tous les profils en attente dans une seule liste. La solution retenue a été d'ajouter un champ personnalisé `verifie` plutôt que de toucher au statut de publication :

```
function annuaire_champ_verification( $post_id ) {
    if ( 'profil_avocat' !== get_post_type( $post_id ) ) {
        return;
    }
    if ( '' === get_post_meta( $post_id, 'verifie', true ) ) {
        update_post_meta( $post_id, 'verifie', 'non' );
    }
}
add_action( 'save_post', 'annuaire_champ_verification' );
```

Le profil reste donc publié au sens WordPress du terme, ce qui permet aux modérateurs de le retrouver facilement, mais un second signal indépendant pilote sa visibilité réelle.

## Étape 2 : exclure les profils non vérifiés des requêtes publiques

> L'essentiel à retenir : Un statut de vérification distinct du statut de publication ; Exclusion des requêtes publiques via pre_get_posts ; Balise noindex tant que le profil n'est pas validé

C'est ici que `pre_get_posts` entre en jeu. Le filtre modifie la requête principale sur le front, uniquement pour les visiteurs anonymes et uniquement sur les listings publics de l'annuaire, en ajoutant une meta query excluant les profils marqués `non` :

```
function annuaire_masquer_non_verifies( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( ! is_post_type_archive( 'profil_avocat' ) && ! is_tax( 'specialite_juridique' ) ) {
        return;
    }
    $meta_query = $query->get( 'meta_query' ) ?: array();
    $meta_query[] = array(
        'key'     => 'verifie',
        'value'   => 'oui',
        'compare' => '=',
    );
    $query->set( 'meta_query', $meta_query );
}
add_action( 'pre_get_posts', 'annuaire_masquer_non_verifies' );
```

Les archives et les pages de catégorie de spécialité ne renvoient donc plus jamais un profil non vérifié dans leurs résultats, ce qui règle le problème pour tout visiteur classique et pour un robot qui parcourrait ces listings.

## Étape 3 : traiter le cas de l'accès direct à la fiche

Exclure les listings ne suffit pas : un profil non vérifié reste accessible directement par son URL, et cette URL peut très bien avoir été explorée avant la mise en place du filtre, ou partagée par erreur. Il faut donc, sur le gabarit de fiche individuelle, ajouter une balise `noindex` conditionnelle tant que le champ `verifie` vaut `non` :

```
function annuaire_noindex_non_verifie() {
    if ( is_singular( 'profil_avocat' ) ) {
        $verifie = get_post_meta( get_the_ID(), 'verifie', true );
        if ( 'oui' !== $verifie ) {
            echo '<meta name="robots" content="noindex,follow">' . "\n";
        }
    }
}
add_action( 'wp_head', 'annuaire_noindex_non_verifie' );
```

Le choix de `follow` plutôt que `nofollow` est volontaire : la page reste accessible aux robots pour permettre une réévaluation rapide une fois le profil validé, seule son entrée dans l'index est bloquée.

## Ce qui ne change pas : la modération des avis

Ce mécanisme concerne uniquement la vérification d'identité des profils, pas la modération des avis clients laissés sur chaque fiche, qui suit un circuit de validation entièrement séparé côté back-office. Mélanger les deux logiques dans le même filtre aurait rendu le code difficile à faire évoluer indépendamment.

- Vérification d'identité : champ `verifie`, filtre `pre_get_posts`, balise `noindex`
- Modération des avis : statut de commentaire distinct, traité par un autre module

## Suivre l'effet du correctif dans Search Console

Une semaine après le déploiement, le rapport de couverture de Search Console montrait le retrait progressif de 340 fiches auparavant indexées sous l'onglet « Indexée, non envoyée dans un sitemap », ce qui confirmait que ces pages n'étaient plus considérées comme faisant partie du contenu public de référence du site.

> Un statut de publication et un statut de confiance sont deux notions différentes. Les confondre oblige tôt ou tard à choisir entre un back-office pratique pour les modérateurs et un front-end propre pour les visiteurs.

## En résumé

Séparer le statut éditorial du statut de vérification métier, puis piloter la visibilité publique via `pre_get_posts` et une balise noindex conditionnelle, permet de gérer proprement une file d'attente de contenus en cours de validation sans jamais recourir à la suppression ni à un statut de brouillon inadapté au flux de travail des modérateurs.
