WordPress как на ладони
wordpress jino

unzip_file() WP 2.5.0

Распаковывает указанный ZIP-архив в папку на сервере с помощью API файловой системы WordPress. Предполагается, что функция WP_Filesystem() уже была вызвана и сконфигурирована.

Не извлекает папку __MACOSX, если она есть в архиве.

Пытается увеличить лимит памяти до 256M перед началом распаковки, хотя количество оперативной памяти не должно быть сильно больше размера распаковываемого архива.

Функционал основан на API файловой ситсемы в основе которого лежит базовый класс WP_Filesystem_Base. Который расширяется подходящим под конкретный сервер классом. Итоговый объект находится в глобальной переменной $wp_filesystem.

Читайте о Filesystem_API (англ.)

Для работы функции вне админки, нужно подключить файл:

require_once ABSPATH . 'wp-admin/includes/file.php';

Возможные методы переменной $wp_filesystem, смотрите у класса:

И у одного из производных от него:

Работает на основе: _unzip_file_pclzip()
Хуки из функции:
Возвращает

Разное. WP_Error в случае ошибки, или True в случае успеха.

Использование

unzip_file( $file, $to );
$file(строка) (обязательный)
Полный путь до архива
$to(строка) (обязательный)
Полный путь до папки куда будет распакован архив. Тут нужно указать путь через API файловой системы WordPress.

Примеры

#1 Пример распаковки архива с помощью unzip_file()

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

Первый параметр, $file, должен быть абсолютным путем к файлу (на сервере), а параметр $to должен указывать на абсолютный путь файловой системы WordPress.

// даже в админке нужно проверить определена ли функция
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 ){
	// OK: архив распакован
}

// НЕПРАВИЛЬНЫЙ вариант использования функции
// $to не может быть прямым путем к папке, иначе методы FTP и SSH остаются в нерабочими
$file = MY_PLUGIN_DIR . '/plugin-file.zip';
$to   = MY_PLUGIN_DIR; 

unzip_file( $file, $to ); 

// НЕПРАВИЛЬНЫЙ вариант использования функции
// Если $file не является "прямым" абсолютным путем, 
// то пользователи, не использующие методы FTP и SSH, остаются с носом
$file = $plugin_path . '/plugin-file.zip'; 
$to   = $plugin_path;

unzip_file($file, $to); 

Код unzip file: wp-admin/includes/file.php VER 4.9.7

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

	if ( ! $wp_filesystem || !is_object($wp_filesystem) )
		return new WP_Error('fs_unavailable', __('Could not access filesystem.'));

	// Unzip can use a lot of memory, but not this much hopefully.
	wp_raise_memory_limit( 'admin' );

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

	// Determine any parent dir's needed (of the upgrade directory)
	if ( ! $wp_filesystem->is_dir($to) ) { //Only do parents if no children exist
		$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) ) // Skip it if it looks like a Windows Drive letter.
				continue;

			if ( ! $wp_filesystem->is_dir($dir) )
				$needed_dirs[] = $dir;
			else
				break; // A folder exists, therefor, we dont need the check the levels below this
		}
	}

	/**
	 * Filters whether to use ZipArchive to unzip archives.
	 *
	 * @since 3.0.0
	 *
	 * @param bool $ziparchive Whether to use ZipArchive. Default true.
	 */
	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;
		}
	}
	// Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file.
	return _unzip_file_pclzip($file, $to, $needed_dirs);
}

Cвязанные функции

Из метки: Файловая система (files dirs folders создание удаление директорий файлов)

Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться