Skip to main content

Formulaires & Candidatures

Formulaires concernés

Deux formulaires Elementor Pro déclenchent l'envoi d'une candidature vers HRMaps :

Form ID ElementorContexte d'utilisation
demande_offreCandidature sur une offre d'emploi spécifique
candidature_spontaneeCandidature 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ètreValeur
URLhttps://niort-freres.hrmaps.cloud/api/AdepApi/SetCandidature
MéthodePOST
Content-Typeapplication/json
Timeout60 secondes

Champs du formulaire

Champ ElementorMeta / Usage
selected_offerID WordPress de l'offre → résolu en PositionID HRMaps
prenomPrénom du candidat
nomNom de famille
emailAdresse e-mail
telephoneNuméro de téléphone
secteursouhaiteSecteur souhaité (candidature spontanée)
messageMessage libre
cvFichier 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
Fichiers temporaires non nettoyés

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" }]
}
}
Champ description

Le 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.

Champ Gender

La 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");
}
});
});