Un compteur affiché sur une offre d’emploi — « 34 candidatures reçues » — donne au visiteur une indication d’attractivité du poste, sans qu’il soit nécessaire d’exposer la moindre information sur les candidats eux-mêmes. La séparation entre cette donnée publique et les dossiers de candidature, strictement confidentiels, doit être totale dès la conception, pas ajoutée après coup en espérant qu’aucune fuite ne se produise.
La bonne pratique consiste à ne jamais faire calculer ce compteur en interrogeant la liste des candidatures à chaque affichage de la page, ce qui obligerait le code d’affichage public à côtoyer, même en lecture, des données qui devraient rester cantonnées à l’espace d’administration.
Séparer strictement les deux types de données
Sur un type de contenu offre_emploi, un simple champ numérique nombre_candidatures stocke le compteur, complètement indépendant du type de contenu candidature qui, lui, contient les CV, lettres de motivation et coordonnées des candidats. Le code d’affichage public de l’offre n’a jamais besoin d’interroger ce second type de contenu.
Incrémenter le compteur à la réception
Au moment où une candidature est enregistrée, généralement via un formulaire dédié, le compteur de l’offre associée est incrémenté d’une unité, sans jamais transmettre le contenu du dossier au processus d’affichage public :

function wpm_incrementer_compteur_candidatures( $offre_id ) {
$compteur_actuel = (int) get_post_meta( $offre_id, 'nombre_candidatures', true );
update_post_meta( $offre_id, 'nombre_candidatures', $compteur_actuel + 1 );
}
add_action( 'wpm_candidature_enregistree', 'wpm_incrementer_compteur_candidatures' );
Ce hook personnalisé wpm_candidature_enregistree se déclenche depuis la logique de traitement du formulaire de candidature, juste après l’enregistrement sécurisé du dossier, en transmettant uniquement l’identifiant de l’offre concernée, jamais les données du candidat.
Afficher le compteur sur la fiche de l’offre
function wpm_afficher_compteur_candidatures( $offre_id ) {
$nombre = (int) get_post_meta( $offre_id, 'nombre_candidatures', true );
if ( $nombre > 0 ) {
echo '<p>' . esc_html( $nombre ) . ' candidature(s) reçue(s)</p>';
}
}
Pourquoi ne pas compter les posts directement
Une alternative aurait consisté à exécuter une requête WP_Query comptant les candidatures liées à l’offre à chaque affichage de la fiche. Cette approche fonctionne techniquement, mais elle oblige la fonction d’affichage public à manipuler, même indirectement, une liste d’objets contenant des données personnelles, ce qui augmente la surface de risque en cas d’erreur de développement future — un simple oubli de restriction de champs pourrait exposer un email par accident.
Protéger le champ candidature de toute exposition publique
- Le type de contenu
candidaturene doit jamais être interrogeable publiquement, ni exposé dans l’API REST par défaut. - Aucune requête sur ce type de contenu ne doit apparaître dans un template accessible sans authentification administrative.
- Le compteur reste la seule information dérivée des candidatures autorisée à transiter vers l’affichage public.
add_filter( 'rest_candidature_query', function ( $args ) {
$args['post_status'] = 'private';
return $args;
} );
Gérer le retrait d’une candidature
Si un candidat retire sa candidature ou si une entrée est supprimée par erreur, le compteur doit être décrémenté symétriquement, sans jamais redescendre sous zéro :
function wpm_decrementer_compteur_candidatures( $offre_id ) {
$compteur_actuel = (int) get_post_meta( $offre_id, 'nombre_candidatures', true );
update_post_meta( $offre_id, 'nombre_candidatures', max( 0, $compteur_actuel - 1 ) );
}
Conseil maison : concevez toujours un compteur public comme une donnée totalement indépendante de la source qu’il résume. Le jour où quelqu’un doit auditer la confidentialité du site, la séparation claire entre les deux types de contenu se vérifie en quelques minutes plutôt qu’en plusieurs jours.
En résumé
Afficher un nombre de candidatures reçues n’exige aucun accès, même en lecture, aux dossiers eux-mêmes. Un compteur incrémenté au moment du dépôt, stocké séparément et jamais recalculé par interrogation directe des candidatures, garantit une confidentialité solide tout en donnant au visiteur une indication utile sur l’attractivité de l’offre.