# pre_get_posts pour restreindre la recherche aux seules offres d’emploi actives

> Une recherche qui remonte des offres pourvues depuis des mois nuit à la crédibilité d'un site de recrutement. Le hook pre_get_posts corrige cela en quelques lignes.

- Auteur : WordPress Développement
- Publié le : 2024-02-28
- Mis à jour le : 2024-02-28
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/pre-get-posts-restreindre-recherche-offres-emploi-actives/

## L’essentiel

- Filtrage appliqué uniquement sur la recherche du front
- Exclusion des statuts fermés sans toucher à l'administration
- Compatible avec un champ personnalisé de statut d'offre

`if ( $query->is_search() && ! is_admin() )` : cette condition, posée en tête d'une fonction accrochée au hook `pre_get_posts`, marque la limite entre une recherche qui remonte n'importe quel contenu et une recherche qui respecte réellement l'état métier des offres d'emploi publiées sur le site.

Un site de recrutement qui laisse la recherche native de WordPress interroger l'ensemble des offres, sans distinction de statut, finit par afficher dans les résultats des postes pourvus depuis des semaines, ce qui agace les candidats et nuit à la crédibilité du site auprès des recruteurs qui le consultent aussi.

## Le problème de la recherche native

La recherche par défaut de WordPress interroge le titre et le contenu des articles publiés, sans tenir compte d'un éventuel champ personnalisé de statut métier, comme « offre_active » ou « offre_pourvue » ajouté sur un type de contenu `offre_emploi`.

## Intercepter la requête avec pre_get_posts

> L'essentiel à retenir : Filtrage appliqué uniquement sur la recherche du front ; Exclusion des statuts fermés sans toucher à l'administration ; Compatible avec un champ personnalisé de statut d'offre

Le hook `pre_get_posts` se déclenche avant l'exécution de toute requête principale de WordPress, ce qui permet de modifier ses paramètres, y compris une requête de recherche déclenchée depuis le formulaire natif du thème.

```
add_action( 'pre_get_posts', function( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    if ( $query->is_search() ) {
        $query->set( 'meta_query', array(
            array(
                'key'   => 'statut_offre',
                'value' => 'active',
            ),
        ) );
    }
} );
```

La double vérification `is_admin()` et `is_main_query()` est indispensable : sans elle, le filtre s'appliquerait aussi aux requêtes secondaires du thème, comme un widget affichant les articles récents, avec des effets de bord difficiles à diagnostiquer ensuite.

## Restreindre aussi le type de contenu recherché

Sur un site qui mélange des offres d'emploi et des articles de blog RH, il est souvent souhaitable de restreindre la recherche au seul type `offre_emploi` lorsque le visiteur utilise le formulaire dédié aux offres, distinct de la recherche générale du site.

```
if ( $query->is_search() && get_query_var( 'type_recherche' ) === 'offres' ) {
    $query->set( 'post_type', 'offre_emploi' );
}
```

## Étapes pour mettre en place le filtre

1. Identifier le champ personnalisé qui porte le statut réel de l'offre
2. Accrocher la fonction au hook `pre_get_posts` avec les vérifications `is_admin()` et `is_main_query()`
3. Ajouter la condition `meta_query` uniquement pour les requêtes de recherche identifiées
4. Tester la recherche avec des offres volontairement fermées pour vérifier leur absence
5. Vérifier que l'administration continue d'afficher toutes les offres, quel que soit leur statut

## Ne pas casser la recherche en administration

Un recruteur qui gère les offres depuis l'administration a besoin, lui, de retrouver une offre fermée pour la consulter ou la rouvrir. Le filtre doit donc rester strictement limité au contexte public du site, jamais appliqué à l'écran de gestion des contenus.

> Un filtre de recherche qui oublie de vérifier `is_admin()` finit toujours par masquer un contenu à la mauvaise personne, généralement découvert au pire moment.

## Combiner avec une exclusion de date de clôture

Certaines offres restent marquées comme actives dans le champ de statut alors que leur date limite de candidature est déjà dépassée, souvent par simple oubli de mise à jour du champ. Ajouter une seconde condition sur une date de clôture, en complément du statut déclaré, sécurise davantage le filtrage sans dépendre uniquement de la discipline du recruteur.

```
$query->set( 'meta_query', array(
    'relation' => 'AND',
    array(
        'key'   => 'statut_offre',
        'value' => 'active',
    ),
    array(
        'key'     => 'date_cloture',
        'value'   => date( 'Ymd' ),
        'compare' => '>=',
        'type'    => 'DATE',
    ),
) );
```

## En résumé

Modifier la requête principale via `pre_get_posts` reste la méthode la plus propre pour aligner la recherche native de WordPress sur le statut métier réel des offres d'emploi. La pertinence du classement des résultats trouvés, elle, dépend d'autres réglages, notamment la pondération du moteur de recherche utilisé.
