Функция 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-архивов. Это полезный инструмент для работы с файлами в вашем плагине или теме.