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

Extensions

Cabinet de recrutement : traiter des candidatures et des CV conformes RGPD

Pour un cabinet de recrutement indépendant, une extension de collecte de CV avec une durée de conservation maîtrisée, pensée dès le schéma de données plutôt qu'ajoutée après coup.

Par Clément Hadrot • 4 avril 2025 • 3 min de lecture • Aucun commentaire
Cabinet de recrutement : traiter des candidatures et des CV conformes RGPD

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;
}
L'essentiel à retenir : La durée de conservation se code, elle ne se documente pas seulement ; Un CV non retenu doit disparaître automatiquement, pas sur demande ; Le consentement du candidat doit être horodaté et rejouable

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 :

Partager :

À propos de l'auteur

Clément Hadrot

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

Voir tous ses articles

Dans la même veine

À lire aussi