Что передавать в $needed_dirs при вызове _unzip_file_pclzip (PclZip)?

1 февр. 2011 г., 17:26:53
Просмотры: 180
Голосов: 0

Я пытаюсь создать резервный метод на случай, если ZipArchive недоступен. Хочу использовать функцию _unzip_file_pclzip() из файла wp-admin/includes/file.php

Однако я не уверен, что ожидается для аргумента $needed_dirs.

Моя целевая папка для распаковки ZIP - это папка "styles" в папке моей темы, поэтому путь будет "wp-content/themes/mytheme/styles/"

Это то, что нужно передавать в $needed_dirs?

function openZip($file_to_open) { 
    global $wp_filesystem;//обязательно, если _unzip_file_pclzip используется напрямую
    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("There was a problem. Please try again!");  
        }
    }
    else
    {
        $needed_dirs = array();
        _unzip_file_pclzip($file_to_open, $target, $needed_dirs);
    }
} 
0
Все ответы на вопрос 1
3

@Scott B Я не тестировал этот скрипт, взят из includes/file.php -> строка 559

_unzip_file_pclzip предполагает, что WP_Filesystem() уже был вызван, поэтому вам нужно установить global $wp_filesystem

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

// Определяем необходимые родительские директории (для директории обновления)
if ( ! $wp_filesystem->is_dir($target) ) { //Проверяем родителей только если нет дочерних элементов
    $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) ) // Пропускаем, если похоже на букву диска Windows.
            continue;

        if ( ! $wp_filesystem->is_dir($dir) )
            $needed_dirs[] = $dir;
        else
             break; // Папка существует, следовательно, не нужно проверять уровни ниже
    }
}
1 февр. 2011 г. 18:14:31
Комментарии

Я добавил глобальную переменную в код своего вопроса. Все еще не уверен, что передавать для $needed_dirs. Вы имеете в виду, что я могу просто передать пустой массив?

Scott B Scott B
1 февр. 2011 г. 18:42:59

Получаю ошибку > Call to a member function mkdir() on a non-object in C:\xampplite\htdocs\mysite\wp-admin\includes\file.php on line 703... Есть идеи?

Scott B Scott B
1 февр. 2011 г. 18:47:22

Насколько я могу судить, проблема заключается в том, что переменная $wp_filesystem не получает значения. Когда я делаю var_dump($wp_filesystem), возвращается NULL. Это делает недействительным вызов $wp_filesystem->mkdir()

Scott B Scott B
1 февр. 2011 г. 20:56:53