- // Is an update available?
- $current = get_option( 'update_plugins' );
- if ( !isset( $current->response[ $plugin ] ) )
- return new WP_Error('up_to_date', __('The plugin is at the latest version.'));
-
- // Is a filesystem accessor setup?
- if ( ! $wp_filesystem || ! is_object($wp_filesystem) )
- WP_Filesystem();
-
- if ( ! is_object($wp_filesystem) )
- return new WP_Error('fs_unavailable', __('Could not access filesystem.'));
-
- if ( $wp_filesystem->errors->get_error_code() )
- return new WP_Error('fs_error', __('Filesystem error'), $wp_filesystem->errors);
-
- //Get the base plugin folder
- $plugins_dir = $wp_filesystem->wp_plugins_dir();
- if ( empty($plugins_dir) )
- return new WP_Error('fs_no_plugins_dir', __('Unable to locate WordPress Plugin directory.'));
-
- //And the same for the Content directory.
- $content_dir = $wp_filesystem->wp_content_dir();
- if( empty($content_dir) )
- return new WP_Error('fs_no_content_dir', __('Unable to locate WordPress Content directory (wp-content).'));
-
- $plugins_dir = trailingslashit( $plugins_dir );
- $content_dir = trailingslashit( $content_dir );
-
- // Get the URL to the zip file
- $r = $current->response[ $plugin ];
-
- if ( empty($r->package) )
- return new WP_Error('no_package', __('Upgrade package not available.'));
-
- // Download the package
- $package = $r->package;
- apply_filters('update_feedback', sprintf(__('Downloading update from %s'), $package));
- $download_file = download_url($package);
-
- if ( is_wp_error($download_file) )
- return new WP_Error('download_failed', __('Download failed.'), $download_file->get_error_message());
-
- $working_dir = $content_dir . 'upgrade/' . basename($plugin, '.php');
-
- // Clean up working directory
- if ( $wp_filesystem->is_dir($working_dir) )
- $wp_filesystem->delete($working_dir, true);
-
- apply_filters('update_feedback', __('Unpacking the update'));
- // Unzip package to working directory
- $result = unzip_file($download_file, $working_dir);
-
- // Once extracted, delete the package
- unlink($download_file);
-
- if ( is_wp_error($result) ) {
- $wp_filesystem->delete($working_dir, true);
- return $result;
- }