Bonjour Benoit
Voici une classe que j’utilise dans un plugin Wordpress
<?php
class ric_import_datatourisme {
/* Connexion avec DATAtourisme */
public static $GlobalFileHandle = null; // stockage temporaire des données reçus par Curl
public static $curlStatus;
public static $curlHeaders;
// Fonction d'importation des données DATAtourisme
public static function importDATAtourisme() {
// Si les dernières données ne sont pas toutes indexées, il ne faut pas faire la maj
$ric_datatourisme_newdatas = get_option( 'ric_datatourisme_newdatas' );
if ( $ric_datatourisme_newdatas === true ) { // non terminé, la maj attendra
exit();
}
// Il faut indiquer à tous les autres traitements de stopper leur travail
update_option('ric_datatourisme_maj_encours', true);
$reponses = array();
$reponses[] = date('Y-m-d H:i:s');
$ric_datatourisme_webservice_url = get_option( 'ric_datatourisme_webservice_url' );
if ( !$ric_datatourisme_webservice_url || $ric_datatourisme_webservice_url == '') {
$reponses[] = 'Merci de renseigner dans "Réglages", la valeur de l\'URL du webservice complète avec sa clé API';
return $reponses;
exit();
}
set_time_limit(0); // no script timeout
$destination_dir = plugin_dir_path( __FILE__ )."../../rowdatas/";
// Importation
$rowdatas_temp_file = $destination_dir.'datas.temp';
ric_import_datatourisme::$GlobalFileHandle = fopen($rowdatas_temp_file, 'w+');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $ric_datatourisme_webservice_url);
curl_setopt($ch, CURLOPT_FILE, ric_import_datatourisme::$GlobalFileHandle);
curl_setopt($ch,CURLOPT_ENCODING , 'gzip');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'ric_import_datatourisme::captureHeader');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, -1);
curl_setopt($ch, CURLOPT_VERBOSE, false);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'ric_import_datatourisme::curlWriteFile');
$curlResponse = curl_exec($ch);
// Gestion des erreurs
if( $curlResponse === false) {
$reponses[] = 'Erreur Curl : ' . curl_error($ch);
} else {
$reponses[] = 'Le téléchargement s\'est terminé sans aucune erreur';
// Récupération du nom du fichier
$rowdatas_saveName = '';
foreach( ric_import_datatourisme::$curlHeaders as $header) {
if (preg_match('/filename="?(.*)"?/', $header, $matches)){
$rowdatas_saveName = str_replace('"','',$matches[1]);
}
}
// Renommage
rename($rowdatas_temp_file, $destination_dir . $rowdatas_saveName);
$reponses[] = 'Le fichier a été renommé en '.$rowdatas_saveName;
}
curl_close($ch);
fclose(ric_import_datatourisme::$GlobalFileHandle);
// Décompression du fichier
$reponses_zip = ric_import_datatourisme::unZip($destination_dir, $destination_dir . $rowdatas_saveName );
$reponses = array_merge( $reponses, $reponses_zip );
// Fin de traitement
$reponses[] = 'Terminé, les données sont prêtes à être indexées';
// Il faut indiquer à tous les autres traitements de reprendre leur travail
update_option('ric_datatourisme_maj_datas_date', date('Y-m-d'));
update_option('ric_datatourisme_maj_encours', false);
update_option('ric_datatourisme_newdatas', true);
// Log du travail effectué
$reponses[] = date('Y-m-d H:i:s');
ric_import_datatourisme::logReponses($reponses);
return $reponses;
}
public static function curlWriteFile($cp, $data) {
$len = fwrite(ric_import_datatourisme::$GlobalFileHandle, $data);
return $len;
}
public static function captureHeader($ch, $headerData){
if (substr($headerData, 0, 4) == 'HTTP'){
ric_import_datatourisme::$curlStatus = substr($headerData, 9, 3);
}
else if (false !== strpos($headerData, ':')){
list($header, $content) = explode(':', $headerData, 2);
//Normalize the header name
$header = ric_import_datatourisme::normalize($header);
$content = trim($content);
ric_import_datatourisme::$curlHeaders[$header] = $content;
}
return strlen($headerData);
}
public static function normalize($header){
return ucfirst(strtolower(trim($header)));
}
public static function unZip( $content_dir, $filename ) {
$reponses = array();
if ( is_file( $filename ) ) {
// Décompression
$zip = new ZipArchive();
if ( $zip->open($filename, ZipArchive::CREATE) !== TRUE ) {
$reponses[] = "Impossible d'ouvrir le fichier ".$filename;
return $reponses ;
} else {
$zip->extractTo($content_dir.'datas/');
$zip->close();
$reponses[] = "Fichier zip chargé et décompressé";
}
// Suppression du zip source
unlink($filename);
$reponses[] = "Fichier zip supprimé";
} else {
$reponses[] = "Aucun fichier zip à traiter";
}
return $reponses;
}
public static function logReponses($reponses) {
// Log du travail effectué
$log_dir = dirname(__FILE__)."/../../logs/"; // dossier où sont placés les fichiers de log
$logfilename = date('Y-m-d') . '_logfile.txt';
$logFile = fopen($log_dir . $logfilename, 'a+');
fwrite( $logFile, '---------------------------------' .chr(13).chr(10) );
foreach ( $reponses as $reponse ) {
fwrite( $logFile, $reponse .chr(13).chr(10) );
}
fwrite( $logFile, '---------------------------------' .chr(13).chr(10) );
fclose( $logFile );
}
}```
Il faudra adapter les fonctions wordpress update_option et get_option permettant de sauvegarder une variable en base de données.
En espérant que cela vous aide