Распаковка ZIP-архивов с функцией UNZIP_FILE() в WordPress

Функция UNZIP_FILE() в WordPress

Функция unzip_file в WordPress позволяет распаковать ZIP-архив на файловой системе. Эта функция работает через абстракцию файловой системы WordPress и требует предварительной инициализации с помощью функции WP_Filesystem(). Если в архиве присутствует директория __MACOSX, она не будет распакована.

Перед распаковкой функция попытается увеличить лимит памяти PHP до 256 МБ. Однако обычно для распаковки достаточно незначительного объема памяти, сравнимого с размером самого архива.

Возврат значения

Функция может вернуть true в случае успешной распаковки или объект класса WP_Error, если произошла ошибка.

Синтаксис использования

unzip_file( $file, $to );
  • $file (string, обязательный) – Полный путь к ZIP-архиву.
  • $to (string, обязательный) – Путь на файловой системе, куда нужно распаковать архив.

Примеры использования

Пример 1: Простая распаковка

Этот пример показывает, как распаковать содержимое ZIP-файла, который находится в директории загрузок WordPress, в ту же папку.

WP_Filesystem();
$destination = wp_upload_dir();
$destination_path = $destination['path'];
$unzipfile = unzip_file("{$destination_path}/filename.zip", $destination_path);

if ($unzipfile) {
    echo 'Файл успешно распакован!';
} else {
    echo 'Ошибка при распаковке файла.';
}

Пример 2: Распаковка архива с учетом файловой системы

Эта функция требует инициализации API файловой системы, однако она не является методом объекта $wp_filesystem. Поэтому параметры нужно передавать с учетом этой особенности.

// Проверяем, определена ли функция
if (!function_exists('unzip_file')) {
    require_once ABSPATH . 'wp-admin/includes/file.php';
}

// Убедимся, что глобальная переменная содержит объект файловой системы
global $wp_filesystem;
if (!$wp_filesystem) {
    WP_Filesystem();
}

define('MY_PLUGIN_DIR', plugin_dir_path(__FILE__));

global $wp_filesystem;

$plugin_path = str_replace(ABSPATH, $wp_filesystem->abspath(), MY_PLUGIN_DIR);

// Правильный способ использования функции
$file = MY_PLUGIN_DIR . '/plugin-file.zip';
$to   = $plugin_path;

$result = unzip_file($file, $to);

if ($result === true) {
    // Архив успешно распакован
}

// Неправильный способ использования функции
// Путь $to не может указывать на директорию напрямую
$file = MY_PLUGIN_DIR . '/plugin-file.zip';
$to   = MY_PLUGIN_DIR;

unzip_file($file, $to);

Примечания

  • Глобальная переменная $wp_filesystem – это подкласс файловой системы WordPress.

Изменения

Функция unzip_file была добавлена в WordPress начиная с версии 2.5.0.

Реализация функции UNZIP_FILE()

Вот код самой функции:


function unzip_file( $file, $to ) {
global $wp_filesystem;

if ( ! $wp_filesystem || ! is_object( $wp_filesystem ) ) {
    return new WP_Error( 'fs_unavailable', __( 'Не удалось получить доступ к файловой системе.' ) );
}

wp_raise_memory_limit( 'admin' );

$needed_dirs = array();
$to          = trailingslashit( $to );

if ( ! $wp_filesystem->is_dir( $to ) ) {
    $path = preg_split('![/]!', untrailingslashit( $to ));
    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)) {
            continue;
        }

        if (!$wp_filesystem->is_dir($dir)) {
            $needed_dirs[] = $dir;
        } else {
            break;
        }
    }
}

if (class_exists('ZipArchive', false) && apply_filters('unzip_file_use_ziparchive', true)) {
    $result = _unzip_file_ziparchive($file, $to, $needed_dirs);
    if (true === $result) {
        return $result;
    } elseif (is_wp_error($result)) {
        if ('incompatible_archive' !== $result->get_error_code()) {
            return $result;
        }
    }
}
return _unzip_file_pclzip($file, $to, $needed_dirs);

}

Теперь вы знаете, как использовать функцию unzip_file в WordPress для распаковки ZIP-архивов. Это полезный инструмент для работы с файлами в вашем плагине или теме.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *