Vingt-quatre mois : c’est la durée maximale recommandée pour conserver un CV non retenu, sans nouveau consentement du candidat. Passé ce délai, l’extension de collecte utilisée par nombre de cabinets de recrutement indépendants continue pourtant de le stocker indéfiniment, faute d’avoir prévu cette limite dès la conception du schéma de données. Ce problème se résout au moment de la conception de l’extension de collecte, pas en ajoutant une case à cocher supplémentaire dans un formulaire déjà en production.
Ce guide construit une extension qui traite les candidatures d’un cabinet de recrutement indépendant, avec une durée de conservation appliquée automatiquement plutôt que promise dans une politique de confidentialité jamais vérifiée par le code. Il ne traite pas la publication d’offres d’emploi — uniquement le traitement des candidatures reçues.
Problème : le CV vit plus longtemps que sa raison d’être
Un formulaire de candidature classique enregistre un fichier PDF dans la médiathèque, crée une ligne dans une table de contacts, et s’arrête là. Rien ne relie cette donnée à une date d’expiration. Deux ans plus tard, l’archive contient des centaines de CV de candidats non retenus, sans qu’aucun mécanisme n’ait déclenché leur suppression — ce qui constitue une conservation excessive au sens du RGPD, même en l’absence de toute mauvaise intention.
Snippet commenté : structurer la candidature avec sa date d’expiration
La solution consiste à inscrire la durée de conservation dans le schéma de données dès la création de la candidature, sous la forme d’une métadonnée de date d’expiration calculée automatiquement.
function enregistrer_candidature( array $donnees, int $fichier_id ) : int {
$candidature_id = wp_insert_post( [
'post_type' => 'candidature',
'post_status' => 'private',
'post_title' => sanitize_text_field( $donnees['nom'] ),
] );
update_post_meta( $candidature_id, '_cv_fichier_id', $fichier_id );
update_post_meta( $candidature_id, '_consentement_date', current_time( 'mysql' ) );
update_post_meta(
$candidature_id,
'_date_expiration',
gmdate( 'Y-m-d H:i:s', strtotime( '+24 months' ) )
);
return $candidature_id;
}

Snippet commenté : la purge automatique via une tâche planifiée
Une tâche planifiée quotidienne parcourt les candidatures dont la date d’expiration est dépassée, supprime le fichier PDF associé, puis le post lui-même. La suppression du fichier ne doit pas être oubliée : garder le post sans le CV, ou l’inverse, laisse une trace partielle tout aussi problématique.
function purger_candidatures_expirees() {
$candidatures = get_posts( [
'post_type' => 'candidature',
'posts_per_page' => 50,
'meta_query' => [ [
'key' => '_date_expiration',
'value' => current_time( 'mysql' ),
'compare' => '<=',
'type' => 'DATETIME',
] ],
] );
foreach ( $candidatures as $candidature ) {
$fichier_id = get_post_meta( $candidature->ID, '_cv_fichier_id', true );
if ( $fichier_id ) {
wp_delete_attachment( $fichier_id, true );
}
wp_delete_post( $candidature->ID, true );
}
}
if ( ! wp_next_scheduled( 'purge_candidatures_quotidienne' ) ) {
wp_schedule_event( time(), 'daily', 'purge_candidatures_quotidienne' );
}
add_action( 'purge_candidatures_quotidienne', 'purger_candidatures_expirees' );
Variante : prolonger la conservation pour un vivier assumé
Certains cabinets souhaitent constituer un vivier de profils intéressants au-delà de la durée par défaut. Cette prolongation ne peut pas être décidée unilatéralement : elle exige un nouveau consentement explicite du candidat, distinct de celui donné pour la candidature initiale. La variante ajoute donc un champ de renouvellement, avec sa propre date d’horodatage.
function prolonger_conservation( int $candidature_id ) {
update_post_meta( $candidature_id, '_consentement_vivier_date', current_time( 'mysql' ) );
update_post_meta(
$candidature_id,
'_date_expiration',
gmdate( 'Y-m-d H:i:s', strtotime( '+24 months' ) )
);
}
Sans cet appel explicite, déclenché uniquement après une action volontaire du candidat — par exemple un lien cliqué dans un e-mail de relance —, la candidature suit son cycle de vie par défaut et disparaît à l’échéance initiale.
Variante : exporter la candidature à la demande du candidat
Le droit à la portabilité impose de pouvoir remettre au candidat une copie structurée de ses données sur simple demande. Une route REST protégée, accessible uniquement par l’administrateur du cabinet, génère un export JSON de la candidature et de son historique de consentement :