function unzip_file($file, $to) {}

Unzips a specified ZIP file to a location on the Filesystem via the WordPress Filesystem Abstraction.
Assumes that WP_Filesystem() has already been called and set up. Does not extract a root-level __MACOSX directory, if present.


  • string $file: Full path and filename of zip archive
  • string $to: Full path on the filesystem to extract archive to

Return values

returns:WP_Error on failure, True on success

Defined filters

  • admin_memory_limit
    apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT )
  • unzip_file_use_ziparchive
    apply_filters('unzip_file_use_ziparchive', true )

Source code

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

	@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );

	$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]) )


			$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.


			if ( ! $wp_filesystem->is_dir($dir) )

				$needed_dirs[] = $dir;


				break; // A folder exists, therefor, we dont need the check the levels below this



	if ( class_exists('ZipArchive') && 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);



No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: