Formulaires & Candidatures
Formulaires concernés
Deux formulaires Elementor Pro déclenchent l'envoi d'une candidature vers HRMaps :
| Form ID Elementor | Contexte d'utilisation |
|---|---|
demande_offre | Candidature sur une offre d'emploi spécifique |
candidature_spontanee | Candidature spontanée (sans offre précise) |
Le hook qui intercepte la soumission :
add_action('elementor_pro/forms/new_record', function ($record, $handler) {
$form_id = $record->get_form_settings('form_id');
if ($form_id == 'demande_offre' || $form_id == 'candidature_spontanee') {
// Traitement...
}
}, 10, 2);
Endpoint d'envoi HRMaps
| Paramètre | Valeur |
|---|---|
| URL | https://niort-freres.hrmaps.cloud/api/AdepApi/SetCandidature |
| Méthode | POST |
| Content-Type | application/json |
| Timeout | 60 secondes |
Champs du formulaire
| Champ Elementor | Meta / Usage |
|---|---|
selected_offer | ID WordPress de l'offre → résolu en PositionID HRMaps |
prenom | Prénom du candidat |
nom | Nom de famille |
email | Adresse e-mail |
telephone | Numéro de téléphone |
secteursouhaite | Secteur souhaité (candidature spontanée) |
message | Message libre |
cv | Fichier CV (champ upload Elementor) |
Résolution de l'offre sélectionnée
Le champ selected_offer peut contenir plusieurs formats selon la configuration du widget Elementor. La résolution suit cet ordre de priorité :
selected_offer = "512"
└─ Numérique pur ──────────────────────► post ID WP = 512
selected_offer = "Chargé de com - CDI (512)"
└─ Contient "(512)" ──────────────────► post ID WP = 512
selected_offer = "Chargé de com CDI 512"
└─ Se termine par "512" ──────────────► post ID WP = 512
Une fois le post ID WordPress obtenu, le PositionID HRMaps est récupéré depuis les metas :
$PositionID = get_post_meta($JobID, '_position_id', true);
Traitement du CV
Le CV est récupéré depuis le champ upload Elementor, puis encodé en Base64 avant envoi à HRMaps.
Flux de récupération
Champ upload Elementor (type = "upload")
│
▼
Champ contenant "cv" dans son ID ?
│
├─ OUI → Récupération des infos fichier
│ │
│ ├─ file_info['path'] accessible ──► Chemin local direct
│ │
│ └─ Seulement une URL ──► Conversion URL → chemin local
│ (upload_dir baseurl → basedir)
│
└─ NON → Erreur loguée, envoi annulé
│
▼ (fallback si fichier local introuvable)
download_url($file_url) ──► Fichier temporaire
Lorsque le fallback download_url() est utilisé, un fichier temporaire est créé sur le serveur mais jamais supprimé dans le code actuel. Ajouter un @unlink($temp_file) après l'encodage pour éviter l'accumulation.
$file_content = file_get_contents($temp_file);
$base64_content = base64_encode($file_content);
@unlink($temp_file); // ← À ajouter
Encodage
$file_content = file_get_contents($file_path);
$base64_content = base64_encode($file_content);
$attachment_data = [
"FileName" => $filename,
"FileType" => "13", // Code type pièce jointe HRMaps
"EmbeddedData" => $base64_content
];
Structure du payload envoyé
{
"schema": null,
"id": null,
"title": "Candidature depuis site web",
"description": "Secteur souhaité : Informatique\n\nMessage : Bonjour, je souhaite...",
"properties": {
"PositionID": 1042,
"PositionTitle": "",
"CandidateID": null,
"Attachment": [
{
"FileName": "cv_john_doe.pdf",
"FileType": "13",
"EmbeddedData": "JVBERi0xLjQK..."
}
]
},
"candidat": {
"GivenName": "John",
"FamilyName": "Doe",
"DateOfBirth": null,
"Gender": 1,
"DisabilityIndicator": false,
"Address": [{ "PostalCode": "" }],
"Phone": [{ "Number": "0612345678" }],
"Email": [{ "Address": "john.doe@example.com" }]
}
}
descriptionLe champ description est construit en concaténant secteursouhaite et message si renseignés. Pour une offre ciblée sans message libre, il peut être null.
GenderLa valeur Gender: 1 est envoyée en dur. HRMaps ne collecte pas ce champ depuis le formulaire public.
Encodage multipart du formulaire
Pour que les fichiers soient correctement transmis via Elementor Pro, l'attribut enctype du formulaire est forcé côté JavaScript :
jQuery(document).ready(function($) {
$(".elementor-form").each(function() {
if ($(this).find("input[type=file]").length > 0) {
$(this).attr("enctype", "multipart/form-data");
}
});
});