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

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_Queryavecmeta_querysurstatut_offre = pourvuepermet 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.