2. Calls AJAX
Une fois le fichier Excel chargé et les données préparées par le code JavaScript, la prochaine étape cruciale dans notre processus d'importation est la transmission de ces données au serveur WordPress pour un traitement plus approfondi. Cette opération est réalisée grâce à des appels AJAX, qui permettent une interaction asynchrone avec le serveur sans nécessiter le rechargement complet de la page.
C'est ici que notre fichier PHP (/inc/import/mais-ajax.php
) entre en jeu, définissant l'action wp_ajax_SID_import_data_mais
qui est invoquée par nos appels AJAX.
2.1 Configuration de l'Action AJAX
Le code PHP suivant est responsable de la configuration de notre action spécifique pour l'importation des données.
add_action('wp_ajax_SID_import_data_mais', 'SID_import_data_mais');
2.2 Le Traitement du Serveur
La fonction SID_import_data_mais
est le cœur de notre logique de traitement côté serveur. Elle reçoit les données envoyées par l'appel AJAX, effectue les vérifications nécessaires pour s'assurer que toutes les données requises sont présentes, puis procède au traitement de ces données.
2.2 Validation des Données
Avant tout traitement, nous vérifions l'existence des données clés nécessaires à l'opération :
if( !isset($_POST['header']) || !isset($_POST['data']) ) die();
Cela empêche l'exécution de la fonction en cas de données manquantes, évitant ainsi des erreurs potentielles.
2.3 Traitement et Insertion des Données
Les données reçues sont ensuite traitées pour en extraire les informations pertinentes. Chaque donnée est nettoyée et formatée selon les besoins spécifiques de notre application. Par exemple, le titre du document est embelli via la fonction beautify_titre_import()
.
Si le document n'existe pas déjà (vérification par numéro de dossier), un nouveau post est créé dans WordPress avec les données fournies. Si le document existe, il est mis à jour avec les nouvelles informations. Cette logique est implémentée comme suit :
if( ! $post_id = checkIfDocumentExist( 'n_de_dossier', $data['dossier'] ) ){
// Logique d'insertion du nouveau post
} else {
// Logique de mise à jour du post existant
}
La fonction checkIfDocumentExist()
est définie dans le fichier /inc/import/mais.php
. Elle permet d'effectuer une query sur les posts Wordpress à l'aide de l'identifiant et de sa valeur fournis.
2.4 Mise à jour du post
Tout d'abord, nous effectuons un "mapping" entre champs ACF qui pourrons être modifiés et les noms des colonnes fournies par le fichier .xlxs
. Par exemple, nous associons la valeur de la colonne "boite" à notre champ ACF "n_de_boite". Cela permet plus de flexibilité, nottament en cas de changement de nomenclature du fichier d'import .xlxs
.
$mapping = [
'resume_pour_diffusion' => 'resume_pour_diffusion',
'debut' => 'debut',
'fin' => 'fin',
'auteur' => 'auteur',
'n_de_boite' => 'boite',
'service_proprietaire' => 'service_proprietaire',
'date_de_prise_de_vue' => 'date_de_prise_de_vue',
'date_de_production' => 'date_de_production',
'droits' => 'droits',
'generique_credits' => 'generique_credits',
'lieu_de_tournage' => 'lieu_de_tournage',
'mots_cles_geographiques' => 'mots_cles_geographiques',
'concept' => 'concept',
'objectifs' => 'objectifs',
'personnalite' => 'personnalite',
'photographe' => 'photographe',
'prix' => 'prix',
'production' => 'production',
'realisateur' => 'realisateur',
'thematique' => 'thematique',
'duree' => 'duree',
];
foreach ($mapping as $acf_field => $data_key) {
// Code
...
// Exemple de beautify de données
if( $data_key == 'generique_credits' ){
$text = wpautop( $data[$data_key] );
update_field($acf_field, $text, $post_id);
continue;
}
// Update acf
update_field($acf_field, $data[$data_key], $post_id);
}
Nous bouclons sur ces champs ACF afin de les mettre à jour sur le "post" courant, certaines données comme les dates ou les génériques sont traitées spécifiquement.
Ensuite certains champs sont mis à jour, dans notre exemple ci-desosus le champ TRUE/FALSE
indiquant si l'archive provient des données "Transparence 39/45", ainsi que la taxonomie personnalisée "theme".
// Transparence 39-45
if( !empty($data['transparence_39_45']) && $data['transparence_39_45'] == 'oui' ){
update_field('transparence_3945', 1, $post_id);
}
// File Added columns (themes)
add_or_create_term(
$post_id,
'theme',
$data['theme']
);
add_or_create_term(
$post_id,
'theme',
$data['sous_theme'],
$data['theme']
);
La fonction add_or_create_term()
est définie dans le fichier /inc/customTaxonomies/add-terme.php
. Elle permet de gérer s'il faut créer ou sélectionner un thème existant ainsi que les spécificités des thèmes pour le projet Sardo (thème parent > thème enfant).
Gestion des fichiers d'archive et de leur prévisualisation
Afin de définir l'image à la une du post Wordpress courant, nous exécutons la fonction upload_media_document()
. Nous détaillerons cette fonction dans une autre rubrique. Celle-ci est définie dans le fichier /inc/import/medias.php
et permet d'ajouter le fichier source de l'archive à la galerie des médias Wordpress, ainsi que de générer une prévisualisation addtionnelle .png
des archives au format .pdf
.
// Thumbnail
$data['thumbnail'] = [null,null];
if( $_POST['preview'] == true ){
if( $thumbnail_and_file = upload_media_document( $data['nom_du_fichier'], $data['transparence_39_45'] ) ){
if( $thumbnail_and_file['file'] ){
update_field('fichier', $thumbnail_and_file['file'], $post_id);
}
if( !empty($thumbnail_and_file['thumbnail']) ){
set_post_thumbnail($post_id, $thumbnail_and_file['thumbnail'][0]);
$data['thumbnail'] = $thumbnail_and_file['thumbnail'];
}
}
}
Enregistrement du post
Pour finir, nous "forçons" l'enregistrement du post en éxecutant l'action wordpress save_post
.
// Update post (for trigger 'save_post' => 'update_data_pour_recherche')
do_action( 'save_post', $post_id, get_post($post_id), true );
Ceci n'est pas strictement obligatoire après la modification de nos ACF, mais nous assure l'éxecution de l'action update_data_pour_recherche
permetant d'enregistrer le champ ACF data_pour_recherche
(data_pour_recherche).
2.5 Réponse AJAX
Après le traitement, une réponse est envoyée au code JavaScript client sous forme de JSON, incluant le statut de l'opération ainsi que toute autre information pertinente, comme l'ID du post créé ou mis à jour et les éventuels aperçus générés pour les documents PDF.
echo json_encode($data);
die();