PHP
Le processus d'export des résultats de recherche au format CSV est orchestré côté serveur par une fonction PHP dédiée, downloadResultsAjax
, déclenchée via des requêtes AJAX depuis le front-end. Cette section explique en détail le rôle et le fonctionnement de cette interaction PHP.
1. Initialisation et Sécurité
La fonction commence par vérifier la présence et la validité d'un cookie contenant les arguments de recherche (search_args
). Cette étape est cruciale pour s'assurer que les données utilisées pour l'export correspondent exactement à celles de la dernière recherche effectuée par l'utilisateur.
// Prevent
if( !isset($_COOKIE['search_args']) || empty($_COOKIE['search_args']) ){
echo json_encode(['error' => 'Cookie d\'arguments de recherche manquant']);
die();
}
2. Préparation des Arguments de Requête
Les arguments de recherche sont récupérés et décodés à partir du cookie. Ces arguments incluent tous les critères de filtrage appliqués par l'utilisateur sur la page des résultats de recherche. La pagination est également gérée ici, permettant de traiter les données par lots pour optimiser les performances et éviter les limitations dues à la taille maximale des requêtes.
// Get args
$args_json = stripslashes($_COOKIE['search_args']);
$args = json_decode($args_json, true);
if( empty($args) ){
echo json_encode(['error' => 'Arguments de recherche manquants']);
die();
}
3. Exécution de la Requête
Une requête WP_Query
est lancée en utilisant les arguments préparés. Cette requête récupère les posts correspondant aux critères de recherche. Chaque post récupéré est ensuite enrichi avec des champs personnalisés (ACF) pertinents pour l'export.
$query = new WP_Query($args);
$posts = $query->posts;
4. Structuration des Données pour le CSV
Les données de chaque post, incluant à la fois les données standards de WordPress (comme le titre et la description) et les champs personnalisés, sont structurées sous forme d'objets. Ces objets sont préparés pour être convertis en lignes du fichier CSV.
// Liste des champs personnalisés à parcourir
$acf_fields = Array(
'n_de_dossier' => 'N° Dossier',
'n_de_boite' => 'N° Boite',
'service_proprietaire' => 'Service propriétaire',
'reference_interne' => 'Référence interne',
'resume_pour_diffusion' => 'Résumé pour diffusion',
'type_de_document' => 'Type de document',
'debut' => 'Début',
'fin' => 'Fin',
'date_de_prise_de_vue' => 'Date de prise de vue',
'date_de_production' => 'Date de production',
'auteur' => 'Auteur',
'droits' => 'Droits',
'generique_credits' => 'Générique / Crédits',
'lieu_de_tournage' => 'Lieu de tournage',
'mots_cles_geographiques' => 'Mots-clés géographiques',
'concept' => 'Concept',
'objectifs' => 'Objectifs',
'personnalite' => 'Personnalité',
'photographe' => 'Photographe',
'prix' => 'Prix',
'production' => 'Production',
'realisateur' => 'Réalisateur',
'thematique' => 'Thématique',
'duree' => 'Durée',
);
// Récupère les données de tous les champs ACF en une seule requête
$acf_values = get_fields($post->ID);
if( $acf_values) {
foreach( $acf_fields as $field_slug => $field_label ){
if( !empty( $acf_values[$field_slug] ) ){
$item[$field_label] = $acf_values[$field_slug];
}
}
}
5. Gestion des Thèmes et Mots-clés
Pour chaque post, les thèmes, sous-thèmes et mots-clés associés sont récupérés et inclus dans les données d'export. Cette étape assure que le fichier CSV contient une représentation complète et utile des données de recherche.
$themes = get_the_terms($post->ID, 'theme');
if ( !empty( $themes ) && !is_wp_error( $themes ) ){
$theme_names = array();
$subtheme_names = array();
if( (is_array($themes) || is_object($themes)) && !empty($themes) ){
foreach ( $themes as $theme ) {
if ($theme->parent == 0) { // Si le terme n'a pas de parent, c'est un thème
$theme_names[] = $theme->name;
} else { // Sinon, c'est un sous-thème
$subtheme_names[] = $theme->name;
}
}
}
$item['Thème'] = implode(', ', $theme_names);
$item['Sous-thème'] = implode(', ', $subtheme_names);
}
6. Pagination et Traitement par Lots
La fonction gère la pagination et permet de traiter les données par lots. Ceci est essentiel pour les grands ensembles de données, permettant de diviser l'export en plusieurs parties afin de minimiser la charge sur le serveur et d'éviter les interruptions.
Exemple :
// Pagination (prevent big query > 10000 posts)
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$items_per_page = 500;
// Update ARGS query with pagination
$args['paged'] = $page;
$args['posts_per_page'] = $items_per_page;
7. Réponse et Téléchargement
Une fois toutes les données de la page courante traitées, une réponse JSON est envoyée au front-end, incluant les données du lot courant ainsi que des informations de pagination. Le front-end peut alors procéder au téléchargement du lot ou demander le lot suivant si nécessaire.
echo json_encode([
'args' => $args,
'data' => $return,
'page' => $page,
'total' => ceil($query->found_posts / $items_per_page),
]);
die();