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()

Хуки з функції

Повертає

true|WP_Error. WP_Error у разі помилки, або True у разі успіху.

Використання

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

Приклади

0

#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);

нотатки

  • Global. WP_Filesystem_Base. $wp_filesystem WordPress filesystem subclass.

список змін

З версії 2.5.0Введено.

Код unzip_file() WP 6.0.2

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 може використовувати багато пам'яті, але не це дуже hopefully.
	wp_raise_memory_limit( 'admin');

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

	// Determine any parent directories потрібна (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( '!^[az]:$!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, therefore we don't need to check the levels below this.
			}
		}
	}

	/**
	 * Filters whether to use ZipArchive для 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, або оголошений error error opening the file.
	return _unzip_file_pclzip( $file, $to, $needed_dirs );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *