unzip_file() – Unzips a specified ZIP file to a location on the filesystem via the WordPress Filesystem Abstraction.

Description

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. Attempts to increase the PHP memory limit to 256M before uncompressing. However, the most memory required shouldn't be much larger than the archive itself.

Usage

$true|WP_Error = unzip_file( $file, $to );

Parameters

$file
( string ) required – Full path and filename of ZIP archive.
$to
( string ) required – Full path on the filesystem to extract archive to.

Returns

true|WP_Error True on success, WP_Error on failure.

Source

File name: wordpress/wp-admin/includes/file.php
Lines:

1 to 54 of 54
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 directories 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, therefore we don't need to 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 );
}
 

 View on GitHub View on Trac

Called by

    Invoked by

      Calls

      Call hooks

      API Letters: ,