WP_Upgrader::unpack_package
Unpacks a compressed package file.
Method of the class: WP_Upgrader{}
No Hooks.
Returns
string|WP_Error. The path to the unpacked contents, or a WP_Error on failure.
Usage
$WP_Upgrader = new WP_Upgrader(); $WP_Upgrader->unpack_package( $package, $delete_package );
- $package(string) (required)
- Full path to the package file.
- $delete_package(true|false)
- Whether to delete the package file after attempting to unpack it.
Default:true
Notes
Global. WP_Filesystem_Base. $wp_filesystem WordPress filesystem subclass. |
Changelog
| Since 2.8.0 | Introduced. |
WP_Upgrader::unpack_package() WP Upgrader::unpack package code WP 7.1.4
<?php
public function unpack_package( $package, $delete_package = true ) {
global $wp_filesystem;
$this->skin->feedback( 'unpack_package' );
if ( ! $wp_filesystem->wp_content_dir() ) {
return new WP_Error( 'fs_no_content_dir', $this->strings['fs_no_content_dir'] );
}
$upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';
// Clean up contents of upgrade directory beforehand, keeping its index.php.
$upgrade_files = $wp_filesystem->dirlist( $upgrade_folder );
if ( ! empty( $upgrade_files ) ) {
foreach ( $upgrade_files as $file ) {
if ( 'index.php' === $file['name'] ) {
continue;
}
$wp_filesystem->delete( $upgrade_folder . $file['name'], true );
}
}
/*
* The upgrade directory is web-served. Keep it from being listed, as core does
* for wp-content and its plugins and themes directories, so the name of the
* working directory created below cannot be discovered from a directory index.
*/
if ( ! $wp_filesystem->is_dir( $upgrade_folder ) ) {
$wp_filesystem->mkdir( $upgrade_folder, FS_CHMOD_DIR );
}
if ( ! $wp_filesystem->exists( $upgrade_folder . 'index.php' ) ) {
$wp_filesystem->put_contents( $upgrade_folder . 'index.php', "<?php\n// Silence is golden.\n", FS_CHMOD_FILE );
}
// We need a working directory.
$working_dir = $upgrade_folder . $this->get_working_dir_name( $package );
// Clean up working directory.
if ( $wp_filesystem->is_dir( $working_dir ) ) {
$wp_filesystem->delete( $working_dir, true );
}
// Unzip package to working directory.
$result = unzip_file( $package, $working_dir );
// Once extracted, delete the package if required.
if ( $delete_package ) {
unlink( $package );
}
if ( is_wp_error( $result ) ) {
$wp_filesystem->delete( $working_dir, true );
if ( 'incompatible_archive' === $result->get_error_code() ) {
return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() );
}
return $result;
}
return $working_dir;
}