| | <?php |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | class Plugin_Upgrader extends WP_Upgrader { |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public $result; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public $bulk = false; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public $new_plugin_data = array(); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function upgrade_strings() { |
| | $this->strings['up_to_date'] = __( 'The plugin is at the latest version.' ); |
| | $this->strings['no_package'] = __( 'Update package not available.' ); |
| | |
| | $this->strings['downloading_package'] = sprintf( __( 'Downloading update from %s…' ), '<span class="code pre">%s</span>' ); |
| | $this->strings['unpack_package'] = __( 'Unpacking the update…' ); |
| | $this->strings['remove_old'] = __( 'Removing the old version of the plugin…' ); |
| | $this->strings['remove_old_failed'] = __( 'Could not remove the old plugin.' ); |
| | $this->strings['process_failed'] = __( 'Plugin update failed.' ); |
| | $this->strings['process_success'] = __( 'Plugin updated successfully.' ); |
| | $this->strings['process_bulk_success'] = __( 'Plugins updated successfully.' ); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function install_strings() { |
| | $this->strings['no_package'] = __( 'Installation package not available.' ); |
| | |
| | $this->strings['downloading_package'] = sprintf( __( 'Downloading installation package from %s…' ), '<span class="code pre">%s</span>' ); |
| | $this->strings['unpack_package'] = __( 'Unpacking the package…' ); |
| | $this->strings['installing_package'] = __( 'Installing the plugin…' ); |
| | $this->strings['remove_old'] = __( 'Removing the current plugin…' ); |
| | $this->strings['remove_old_failed'] = __( 'Could not remove the current plugin.' ); |
| | $this->strings['no_files'] = __( 'The plugin contains no files.' ); |
| | $this->strings['process_failed'] = __( 'Plugin installation failed.' ); |
| | $this->strings['process_success'] = __( 'Plugin installed successfully.' ); |
| | |
| | $this->strings['process_success_specific'] = __( 'Successfully installed the plugin <strong>%1$s %2$s</strong>.' ); |
| |
|
| | if ( ! empty( $this->skin->overwrite ) ) { |
| | if ( 'update-plugin' === $this->skin->overwrite ) { |
| | $this->strings['installing_package'] = __( 'Updating the plugin…' ); |
| | $this->strings['process_failed'] = __( 'Plugin update failed.' ); |
| | $this->strings['process_success'] = __( 'Plugin updated successfully.' ); |
| | } |
| |
|
| | if ( 'downgrade-plugin' === $this->skin->overwrite ) { |
| | $this->strings['installing_package'] = __( 'Downgrading the plugin…' ); |
| | $this->strings['process_failed'] = __( 'Plugin downgrade failed.' ); |
| | $this->strings['process_success'] = __( 'Plugin downgraded successfully.' ); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function install( $package, $args = array() ) { |
| | $defaults = array( |
| | 'clear_update_cache' => true, |
| | 'overwrite_package' => false, |
| | ); |
| | $parsed_args = wp_parse_args( $args, $defaults ); |
| |
|
| | $this->init(); |
| | $this->install_strings(); |
| |
|
| | add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); |
| |
|
| | if ( $parsed_args['clear_update_cache'] ) { |
| | |
| | add_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9, 0 ); |
| | } |
| |
|
| | $this->run( |
| | array( |
| | 'package' => $package, |
| | 'destination' => WP_PLUGIN_DIR, |
| | 'clear_destination' => $parsed_args['overwrite_package'], |
| | 'clear_working' => true, |
| | 'hook_extra' => array( |
| | 'type' => 'plugin', |
| | 'action' => 'install', |
| | ), |
| | ) |
| | ); |
| |
|
| | remove_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9 ); |
| | remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); |
| |
|
| | if ( ! $this->result || is_wp_error( $this->result ) ) { |
| | return $this->result; |
| | } |
| |
|
| | |
| | wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); |
| |
|
| | if ( $parsed_args['overwrite_package'] ) { |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | do_action( 'upgrader_overwrote_package', $package, $this->new_plugin_data, 'plugin' ); |
| | } |
| |
|
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function upgrade( $plugin, $args = array() ) { |
| | $defaults = array( |
| | 'clear_update_cache' => true, |
| | ); |
| | $parsed_args = wp_parse_args( $args, $defaults ); |
| |
|
| | $this->init(); |
| | $this->upgrade_strings(); |
| |
|
| | $current = get_site_transient( 'update_plugins' ); |
| | if ( ! isset( $current->response[ $plugin ] ) ) { |
| | $this->skin->before(); |
| | $this->skin->set_result( false ); |
| | $this->skin->error( 'up_to_date' ); |
| | $this->skin->after(); |
| | return false; |
| | } |
| |
|
| | |
| | $r = $current->response[ $plugin ]; |
| |
|
| | add_filter( 'upgrader_pre_install', array( $this, 'deactivate_plugin_before_upgrade' ), 10, 2 ); |
| | add_filter( 'upgrader_pre_install', array( $this, 'active_before' ), 10, 2 ); |
| | add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ), 10, 4 ); |
| | add_filter( 'upgrader_post_install', array( $this, 'active_after' ), 10, 2 ); |
| | |
| | |
| | |
| | |
| | if ( $parsed_args['clear_update_cache'] ) { |
| | |
| | add_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9, 0 ); |
| | } |
| |
|
| | $this->run( |
| | array( |
| | 'package' => $r->package, |
| | 'destination' => WP_PLUGIN_DIR, |
| | 'clear_destination' => true, |
| | 'clear_working' => true, |
| | 'hook_extra' => array( |
| | 'plugin' => $plugin, |
| | 'type' => 'plugin', |
| | 'action' => 'update', |
| | 'temp_backup' => array( |
| | 'slug' => dirname( $plugin ), |
| | 'src' => WP_PLUGIN_DIR, |
| | 'dir' => 'plugins', |
| | ), |
| | ), |
| | ) |
| | ); |
| |
|
| | |
| | remove_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9 ); |
| | remove_filter( 'upgrader_pre_install', array( $this, 'deactivate_plugin_before_upgrade' ) ); |
| | remove_filter( 'upgrader_pre_install', array( $this, 'active_before' ) ); |
| | remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ) ); |
| | remove_filter( 'upgrader_post_install', array( $this, 'active_after' ) ); |
| |
|
| | if ( ! $this->result || is_wp_error( $this->result ) ) { |
| | return $this->result; |
| | } |
| |
|
| | |
| | wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); |
| |
|
| | |
| | |
| | |
| | |
| | $past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() ); |
| |
|
| | if ( isset( $past_failure_emails[ $plugin ] ) ) { |
| | unset( $past_failure_emails[ $plugin ] ); |
| | update_option( 'auto_plugin_theme_update_emails', $past_failure_emails ); |
| | } |
| |
|
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function bulk_upgrade( $plugins, $args = array() ) { |
| | global $wp_version; |
| |
|
| | $defaults = array( |
| | 'clear_update_cache' => true, |
| | ); |
| | $parsed_args = wp_parse_args( $args, $defaults ); |
| |
|
| | $this->init(); |
| | $this->bulk = true; |
| | $this->upgrade_strings(); |
| |
|
| | $current = get_site_transient( 'update_plugins' ); |
| |
|
| | add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ), 10, 4 ); |
| |
|
| | $this->skin->header(); |
| |
|
| | |
| | $res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) ); |
| | if ( ! $res ) { |
| | $this->skin->footer(); |
| | return false; |
| | } |
| |
|
| | $this->skin->bulk_header(); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | $maintenance = ( is_multisite() && ! empty( $plugins ) ); |
| | foreach ( $plugins as $plugin ) { |
| | $maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin ] ) ); |
| | } |
| | if ( $maintenance ) { |
| | $this->maintenance_mode( true ); |
| | } |
| |
|
| | $results = array(); |
| |
|
| | $this->update_count = count( $plugins ); |
| | $this->update_current = 0; |
| | foreach ( $plugins as $plugin ) { |
| | ++$this->update_current; |
| | $this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true ); |
| |
|
| | if ( ! isset( $current->response[ $plugin ] ) ) { |
| | $this->skin->set_result( 'up_to_date' ); |
| | $this->skin->before(); |
| | $this->skin->feedback( 'up_to_date' ); |
| | $this->skin->after(); |
| | $results[ $plugin ] = true; |
| | continue; |
| | } |
| |
|
| | |
| | $r = $current->response[ $plugin ]; |
| |
|
| | $this->skin->plugin_active = is_plugin_active( $plugin ); |
| |
|
| | if ( isset( $r->requires ) && ! is_wp_version_compatible( $r->requires ) ) { |
| | $result = new WP_Error( |
| | 'incompatible_wp_required_version', |
| | sprintf( |
| | |
| | __( 'Your WordPress version is %1$s, however the new plugin version requires %2$s.' ), |
| | $wp_version, |
| | $r->requires |
| | ) |
| | ); |
| |
|
| | $this->skin->before( $result ); |
| | $this->skin->error( $result ); |
| | $this->skin->after(); |
| | } elseif ( isset( $r->requires_php ) && ! is_php_version_compatible( $r->requires_php ) ) { |
| | $result = new WP_Error( |
| | 'incompatible_php_required_version', |
| | sprintf( |
| | |
| | __( 'The PHP version on your server is %1$s, however the new plugin version requires %2$s.' ), |
| | PHP_VERSION, |
| | $r->requires_php |
| | ) |
| | ); |
| |
|
| | $this->skin->before( $result ); |
| | $this->skin->error( $result ); |
| | $this->skin->after(); |
| | } else { |
| | add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); |
| | $result = $this->run( |
| | array( |
| | 'package' => $r->package, |
| | 'destination' => WP_PLUGIN_DIR, |
| | 'clear_destination' => true, |
| | 'clear_working' => true, |
| | 'is_multi' => true, |
| | 'hook_extra' => array( |
| | 'plugin' => $plugin, |
| | 'temp_backup' => array( |
| | 'slug' => dirname( $plugin ), |
| | 'src' => WP_PLUGIN_DIR, |
| | 'dir' => 'plugins', |
| | ), |
| | ), |
| | ) |
| | ); |
| | remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); |
| | } |
| |
|
| | $results[ $plugin ] = $result; |
| |
|
| | |
| | if ( false === $result ) { |
| | break; |
| | } |
| | } |
| |
|
| | $this->maintenance_mode( false ); |
| |
|
| | |
| | wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); |
| |
|
| | |
| | do_action( |
| | 'upgrader_process_complete', |
| | $this, |
| | array( |
| | 'action' => 'update', |
| | 'type' => 'plugin', |
| | 'bulk' => true, |
| | 'plugins' => $plugins, |
| | ) |
| | ); |
| |
|
| | $this->skin->bulk_footer(); |
| |
|
| | $this->skin->footer(); |
| |
|
| | |
| | remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ) ); |
| |
|
| | |
| | |
| | |
| | |
| | $past_failure_emails = get_option( 'auto_plugin_theme_update_emails', array() ); |
| |
|
| | foreach ( $results as $plugin => $result ) { |
| | |
| | if ( ! $result || is_wp_error( $result ) || ! isset( $past_failure_emails[ $plugin ] ) ) { |
| | continue; |
| | } |
| |
|
| | unset( $past_failure_emails[ $plugin ] ); |
| | } |
| |
|
| | update_option( 'auto_plugin_theme_update_emails', $past_failure_emails ); |
| |
|
| | return $results; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function check_package( $source ) { |
| | global $wp_filesystem, $wp_version; |
| |
|
| | $this->new_plugin_data = array(); |
| |
|
| | if ( is_wp_error( $source ) ) { |
| | return $source; |
| | } |
| |
|
| | $working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit( WP_CONTENT_DIR ), $source ); |
| | if ( ! is_dir( $working_directory ) ) { |
| | return $source; |
| | } |
| |
|
| | |
| | $files = glob( $working_directory . '*.php' ); |
| | if ( $files ) { |
| | foreach ( $files as $file ) { |
| | $info = get_plugin_data( $file, false, false ); |
| | if ( ! empty( $info['Name'] ) ) { |
| | $this->new_plugin_data = $info; |
| | break; |
| | } |
| | } |
| | } |
| |
|
| | if ( empty( $this->new_plugin_data ) ) { |
| | return new WP_Error( 'incompatible_archive_no_plugins', $this->strings['incompatible_archive'], __( 'No valid plugins were found.' ) ); |
| | } |
| |
|
| | $requires_php = isset( $info['RequiresPHP'] ) ? $info['RequiresPHP'] : null; |
| | $requires_wp = isset( $info['RequiresWP'] ) ? $info['RequiresWP'] : null; |
| |
|
| | if ( ! is_php_version_compatible( $requires_php ) ) { |
| | $error = sprintf( |
| | |
| | __( 'The PHP version on your server is %1$s, however the uploaded plugin requires %2$s.' ), |
| | PHP_VERSION, |
| | $requires_php |
| | ); |
| |
|
| | return new WP_Error( 'incompatible_php_required_version', $this->strings['incompatible_archive'], $error ); |
| | } |
| |
|
| | if ( ! is_wp_version_compatible( $requires_wp ) ) { |
| | $error = sprintf( |
| | |
| | __( 'Your WordPress version is %1$s, however the uploaded plugin requires %2$s.' ), |
| | $wp_version, |
| | $requires_wp |
| | ); |
| |
|
| | return new WP_Error( 'incompatible_wp_required_version', $this->strings['incompatible_archive'], $error ); |
| | } |
| |
|
| | return $source; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function plugin_info() { |
| | if ( ! is_array( $this->result ) ) { |
| | return false; |
| | } |
| | if ( empty( $this->result['destination_name'] ) ) { |
| | return false; |
| | } |
| |
|
| | |
| | $plugin = get_plugins( '/' . $this->result['destination_name'] ); |
| | if ( empty( $plugin ) ) { |
| | return false; |
| | } |
| |
|
| | |
| | $pluginfiles = array_keys( $plugin ); |
| |
|
| | return $this->result['destination_name'] . '/' . $pluginfiles[0]; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function deactivate_plugin_before_upgrade( $response, $plugin ) { |
| |
|
| | if ( is_wp_error( $response ) ) { |
| | return $response; |
| | } |
| |
|
| | |
| | if ( wp_doing_cron() ) { |
| | return $response; |
| | } |
| |
|
| | $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; |
| | if ( empty( $plugin ) ) { |
| | return new WP_Error( 'bad_request', $this->strings['bad_request'] ); |
| | } |
| |
|
| | if ( is_plugin_active( $plugin ) ) { |
| | |
| | deactivate_plugins( $plugin, true ); |
| | } |
| |
|
| | return $response; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function active_before( $response, $plugin ) { |
| | if ( is_wp_error( $response ) ) { |
| | return $response; |
| | } |
| |
|
| | |
| | if ( ! wp_doing_cron() ) { |
| | return $response; |
| | } |
| |
|
| | $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; |
| |
|
| | |
| | if ( ! is_plugin_active( $plugin ) ) { |
| | return $response; |
| | } |
| |
|
| | |
| | if ( ! $this->bulk ) { |
| | $this->maintenance_mode( true ); |
| | } |
| |
|
| | return $response; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function active_after( $response, $plugin ) { |
| | if ( is_wp_error( $response ) ) { |
| | return $response; |
| | } |
| |
|
| | |
| | if ( ! wp_doing_cron() ) { |
| | return $response; |
| | } |
| |
|
| | $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; |
| |
|
| | |
| | if ( ! is_plugin_active( $plugin ) ) { |
| | return $response; |
| | } |
| |
|
| | |
| | if ( ! $this->bulk ) { |
| | $this->maintenance_mode( false ); |
| | } |
| |
|
| | return $response; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function delete_old_plugin( $removed, $local_destination, $remote_destination, $plugin ) { |
| | global $wp_filesystem; |
| |
|
| | if ( is_wp_error( $removed ) ) { |
| | return $removed; |
| | } |
| |
|
| | $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; |
| | if ( empty( $plugin ) ) { |
| | return new WP_Error( 'bad_request', $this->strings['bad_request'] ); |
| | } |
| |
|
| | $plugins_dir = $wp_filesystem->wp_plugins_dir(); |
| | $this_plugin_dir = trailingslashit( dirname( $plugins_dir . $plugin ) ); |
| |
|
| | if ( ! $wp_filesystem->exists( $this_plugin_dir ) ) { |
| | return $removed; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | if ( strpos( $plugin, '/' ) && $this_plugin_dir !== $plugins_dir ) { |
| | $deleted = $wp_filesystem->delete( $this_plugin_dir, true ); |
| | } else { |
| | $deleted = $wp_filesystem->delete( $plugins_dir . $plugin ); |
| | } |
| |
|
| | if ( ! $deleted ) { |
| | return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] ); |
| | } |
| |
|
| | return true; |
| | } |
| | } |
| |
|