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