# Retirer un formulaire de candidature dès qu’un poste est pourvu, page conservée

> Un cabinet de recrutement veut garder la trace d'une offre pourvue sans laisser un formulaire actif. Voici le champ de statut et le conditionnel qui remplacent le formulaire par un message.

- Auteur : WordPress Développement
- Publié le : 2022-10-31
- Mis à jour le : 2022-10-31
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/masquer-formulaire-candidature-poste-pourvu/

## L’essentiel

- Champ de statut plutôt que suppression
- Formulaire remplacé par un message contextuel
- Historique de l'offre conservé pour les statistiques

Douze mille candidatures perdues : c'est ce qu'un cabinet de recrutement m'a montré un jour, un tableur qui recensait chaque offre supprimée du site dès qu'elle était pourvue. Plus de fiche, plus d'historique, plus moyen de dire à un candidat recalé « nous avons votre profil pour la prochaine ouverture ». La suppression brutale de la page réglait le problème du formulaire actif, mais en créait un autre : la perte de la mémoire du poste.

La bonne réponse n'est pas de supprimer la fiche, c'est de la garder et de couper uniquement le formulaire. Un champ personnalisé de statut, un conditionnel côté gabarit, et l'offre pourvue devient une page d'archive lisible plutôt qu'une erreur 404. Voici comment j'ai construit ce mécanisme pour un cabinet qui recrute pour des cabinets d'expertise comptable.

## Un champ de statut plutôt qu'un état binaire publié/dépublié

La tentation la plus courante consiste à basculer le statut de l'article en brouillon dès que le poste est pourvu. C'est simple, mais cela retire la fiche des résultats de recherche interne et casse les liens partagés sur les réseaux professionnels. À la place, j'ajoute un champ personnalisé `statut_offre` avec deux valeurs possibles : `ouverte` et `pourvue`. L'article reste publié, seul son contenu affiché change.

```
function ch_render_meta_box_statut_offre( $post ) {
    $valeur = get_post_meta( $post->ID, 'statut_offre', true ) ?: 'ouverte';
    wp_nonce_field( 'ch_statut_offre_nonce', 'ch_statut_offre_nonce_field' );
    ?>
    <p>
        <label>
            <input type="radio" name="statut_offre" value="ouverte" <?php checked( $valeur, 'ouverte' ); ?> />
            Offre ouverte
        </label><br />
        <label>
            <input type="radio" name="statut_offre" value="pourvue" <?php checked( $valeur, 'pourvue' ); ?> />
            Poste pourvu
        </label>
    </p>
    <?php
}
add_action( 'add_meta_boxes', function () {
    add_meta_box( 'ch_statut_offre', 'Statut du poste', 'ch_render_meta_box_statut_offre', 'offre', 'side' );
} );
```

> L'essentiel à retenir : Champ de statut plutôt que suppression ; Formulaire remplacé par un message contextuel ; Historique de l'offre conservé pour les statistiques

## Conditionner l'affichage du formulaire dans le gabarit

Dans le fichier `single-offre.php`, la logique reste volontairement courte : on lit le champ, on affiche le formulaire seulement si le statut vaut `ouverte`, sinon on affiche un bloc explicatif avec un lien vers les autres offres du cabinet.

```
<?php
$statut = get_post_meta( get_the_ID(), 'statut_offre', true ) ?: 'ouverte';

if ( 'pourvue' === $statut ) :
    ?>
    <div class="offre-pourvue">
        <p>Ce poste a trouvé son candidat. Consultez nos <a href="/offres/">offres en cours</a> ou déposez une candidature spontanée.</p>
    </div>
    <?php
else :
    get_template_part( 'template-parts/formulaire-candidature' );
endif;
?>
```

L'avantage de cette structure : le formulaire de candidature spontanée peut être appelé exactement de la même façon dans le bloc « offre pourvue », en changeant simplement le paramètre transmis à `get_template_part()` pour lui passer le contexte.

## Sécuriser l'enregistrement du champ

Le champ ne doit être modifiable que par les rôles autorisés à publier des offres, et jamais depuis une requête externe. J'utilise la fonction `save_post` avec vérification de nonce et de capacité, une pratique standard mais souvent bâclée sur ce type de champ discret.

```
add_action( 'save_post_offre', function ( $post_id ) {
    if ( ! isset( $_POST['ch_statut_offre_nonce_field'] ) ) {
        return;
    }
    if ( ! wp_verify_nonce( $_POST['ch_statut_offre_nonce_field'], 'ch_statut_offre_nonce' ) ) {
        return;
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
    if ( isset( $_POST['statut_offre'] ) ) {
        update_post_meta( $post_id, 'statut_offre', sanitize_text_field( $_POST['statut_offre'] ) );
    }
} );
```

## Ce que cette organisation apporte au recruteur

Une fois le mécanisme en place, plusieurs usages deviennent possibles sans développement supplémentaire :

- Une requête `WP_Query` avec `meta_query` sur `statut_offre = pourvue` permet d'afficher un module « postes récemment pourvus » qui rassure les visiteurs sur l'activité du cabinet.
- Le lien de partage sur les réseaux reste valide indéfiniment, l'offre change simplement de visage une fois le recrutement terminé.
- Le référencement de la page est préservé : Google conserve l'historique d'indexation plutôt que de rencontrer une erreur 404 sur une URL déjà positionnée.

Ce dispositif ne traite volontairement pas l'archivage des candidatures déjà reçues sur une offre pourvue : c'est un sujet distinct, qui relève de la conservation des données personnelles et mérite son propre traitement, en particulier sur la durée de rétention.

> Sur un site de recrutement, la fiche d'offre est souvent plus consultée après sa clôture qu'avant : ne la supprimez jamais tant qu'elle reçoit du trafic.

## En résumé

Un simple champ de statut, un conditionnel dans le gabarit et une vérification de nonce suffisent à remplacer une suppression brutale par une transition propre. Le cabinet garde son historique, le candidat garde une information claire, et le référencement de la page n'est jamais sacrifié pour un problème d'affichage qui se résolvait en quelques lignes.
