Cosa dovrei passare per $needed_dirs quando chiamo _unzip_file_pclzip (alias PclZip)?

1 feb 2011, 17:26:53
Visualizzazioni: 180
Voti: 0

Sto cercando di creare un metodo di fallback quando ZipArchive non è presente. Vorrei utilizzare la funzione _unzip_file_pclzip() contenuta in wp-admin/includes/file.php

Tuttavia, non sono sicuro di cosa ci si aspetta per l'argomento $needed_dirs.

La cartella di destinazione per il file zip sarà la cartella "styles" sotto la cartella del mio tema, quindi il percorso sarebbe "wp-content/themes/mytheme/styles/"

È questo che ci si aspetta per $needed_dirs?

function openZip($file_to_open) { 
    global $wp_filesystem;//richiesto se _unzip_file_pclzip viene usato direttamente
    global $target;  
    if(class_exists('ZipArchive'))
    {
        $zip = new ZipArchive();  
        $x = $zip->open($file_to_open);  
        if($x === true) 
        {  
            $zip->extractTo($target);  
            $zip->close();                
            unlink($file_to_open);  
        } else {  
            die("Si è verificato un problema. Per favore riprova!");  
        }
    }
    else
    {
        $needed_dirs = array();
        _unzip_file_pclzip($file_to_open, $target, $needed_dirs);
    }
} 
0
Tutte le risposte alla domanda 1
3

@Scott B Non ho testato questo script, preso da includes/file.php -> linea 559

_unzip_file_pclzip presuppone che WP_Filesystem() sia già stato chiamato, quindi devi impostare global $wp_filesystem

global $wp_filesystem;
$needed_dirs = array();
$target = trailingslashit($target);

// Determina le eventuali directory genitore necessarie (della directory di aggiornamento)
if ( ! $wp_filesystem->is_dir($target) ) { //Esegue solo i genitori se non esistono figli
    $path = preg_split('![/\\\]!', untrailingslashit($target));
    for ( $i = count($path); $i >= 0; $i-- ) {
        if ( empty($path[$i]) )
            continue;

        $dir = implode('/', array_slice($path, 0, $i+1) );
        if ( preg_match('!^[a-z]:$!i', $dir) ) // Salta se sembra una lettera di unità Windows.
            continue;

        if ( ! $wp_filesystem->is_dir($dir) )
            $needed_dirs[] = $dir;
        else
             break; // Esiste una cartella, quindi non è necessario controllare i livelli sottostanti
    }
}
1 feb 2011 18:14:31
Commenti

Ho aggiunto il globale al mio codice della domanda. Non sono ancora sicuro di cosa passare per $needed_dirs. Stai dicendo che posso semplicemente passare un array vuoto?

Scott B Scott B
1 feb 2011 18:42:59

Ricevo l'errore > Call to a member function mkdir() on a non-object in C:\xampplite\htdocs\mysite\wp-admin\includes\file.php on line 703... Hai qualche idea?

Scott B Scott B
1 feb 2011 18:47:22

Da quello che posso capire, il problema sta nel fatto che la variabile $wp_filesystem non viene indicizzata. Quando faccio var_dump($wp_filesystem), restituisce NULL. Quindi questo invalida la chiamata a $wp_filesystem->mkdir()

Scott B Scott B
1 feb 2011 20:56:53