Le WordPress d'aujourd'hui, décodé pour les développeurs

Astuces

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.

Par WordPress Développement • 28 février 2024 • 4 min de lecture • Aucun commentaire
pre_get_posts pour restreindre la recherche aux seules offres d'emploi actives

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é.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi