From 2e12a7cc82fbb7ccc77fe7573ebd101ffc703713 Mon Sep 17 00:00:00 2001 From: Peter Westwood Date: Fri, 26 Sep 2008 06:43:53 +0000 Subject: [PATCH] Theme update UI first pass. See #7519 props DD32. git-svn-id: https://develop.svn.wordpress.org/trunk@8989 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-admin/includes/schema.php | 1 + wp-admin/includes/update.php | 123 +++++++++++++++++++++++++++++++++- wp-admin/includes/upgrade.php | 4 +- wp-admin/themes.php | 31 ++++++++- wp-admin/update.php | 70 +++++++++++++++++-- wp-includes/version.php | 2 +- 6 files changed, 221 insertions(+), 10 deletions(-) diff --git a/wp-admin/includes/schema.php b/wp-admin/includes/schema.php index a96b4c0aa8..b62a4a5db5 100644 --- a/wp-admin/includes/schema.php +++ b/wp-admin/includes/schema.php @@ -456,6 +456,7 @@ function populate_roles_270() { if ( !empty( $role ) ) { $role->add_cap( 'install_plugins' ); + $role->add_cap( 'update_themes' ); } } diff --git a/wp-admin/includes/update.php b/wp-admin/includes/update.php index 169e9acb1c..2cc2a7eaee 100644 --- a/wp-admin/includes/update.php +++ b/wp-admin/includes/update.php @@ -170,7 +170,7 @@ function wp_update_plugin($plugin, $feedback = '') { // Copy new version of plugin into place. $result = copy_dir($working_dir, $plugins_dir); if ( is_wp_error($result) ) { - //$wp_filesystem->delete($working_dir, true); //TODO: Uncomment? This DOES mean that the new files are available in the upgrade folder if it fails. + $wp_filesystem->delete($working_dir, true); return $result; } @@ -193,6 +193,127 @@ function wp_update_plugin($plugin, $feedback = '') { return $folder . '/' . $pluginfiles[0]; } +function wp_update_theme($theme, $feedback = '') { + global $wp_filesystem; + + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + // Is an update available? + $current = get_option( 'update_themes' ); + if ( !isset( $current->response[ $theme ] ) ) + return new WP_Error('up_to_date', __('The theme is at the latest version.')); + + $r = $current->response[ $theme ]; + + $themes = get_themes(); + foreach ( (array) $themes as $this_theme ) { + if ( $this_theme['Stylesheet'] == $theme ) { + $theme_directory = preg_replace('!^/themes/!i', '', $this_theme['Stylesheet Dir']); + break; + } + } + unset($themes); + + if ( empty($theme_directory) ) + return new WP_Error('theme_non_existant', __('Theme does not exist.')); + + // 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 + $themes_dir = $wp_filesystem->wp_themes_dir(); + if ( empty($themes_dir) ) + return new WP_Error('fs_no_themes_dir', __('Unable to locate WordPress Theme 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).')); + + $themes_dir = trailingslashit( $themes_dir ); + $content_dir = trailingslashit( $content_dir ); + + if ( empty($r->package) ) + return new WP_Error('no_package', __('Upgrade package not available.')); + + // Download the package + apply_filters('update_feedback', sprintf(__('Downloading update from %s'), $r['package'])); + $download_file = download_url($r['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($theme_directory); + + // 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; + } + + //TODO: Is theme currently active? If so, set default theme + /* + if ( is_plugin_active($plugin) ) { + //Deactivate the plugin silently, Prevent deactivation hooks from running. + apply_filters('update_feedback', __('Deactivating the plugin')); + deactivate_plugins($plugin, true); + }*/ + + // Remove the existing plugin. + apply_filters('update_feedback', __('Removing the old version of the theme')); + $deleted = $wp_filesystem->delete($themes_dir . $theme_directory, true); + + if ( ! $deleted ) { + $wp_filesystem->delete($working_dir, true); + return new WP_Error('delete_failed', __('Could not remove the old plugin')); + } + + apply_filters('update_feedback', __('Installing the latest version')); + // Copy new version of plugin into place. + $result = copy_dir($working_dir, $themes_dir); + if ( is_wp_error($result) ) { + $wp_filesystem->delete($working_dir, true); + return $result; + } + + //Get a list of the directories in the working directory before we delete it, We need to know the new folder for the plugin + //$filelist = array_keys( $wp_filesystem->dirlist($working_dir) ); + + // Remove working directory + $wp_filesystem->delete($working_dir, true); + + // Force refresh of plugin update information + delete_option('update_themes'); + + /*if( empty($filelist) ) + return false; //We couldnt find any files in the working dir, therefor no plugin installed? Failsafe backup. + + $folder = $filelist[0]; + $plugin = get_plugins('/' . $folder); //Ensure to pass with leading slash + $pluginfiles = array_keys($plugin); //Assume the requested plugin is the first in the list + + return $folder . '/' . $pluginfiles[0];*/ +} + + function wp_update_core($feedback = '') { global $wp_filesystem; diff --git a/wp-admin/includes/upgrade.php b/wp-admin/includes/upgrade.php index 148b8543da..edd5ba9475 100644 --- a/wp-admin/includes/upgrade.php +++ b/wp-admin/includes/upgrade.php @@ -210,7 +210,7 @@ function upgrade_all() { if ( $wp_current_db_version < 8201 ) upgrade_260(); - if ( $wp_current_db_version < 8921 ) + if ( $wp_current_db_version < 8989 ) upgrade_270(); maybe_disable_automattic_widgets(); @@ -766,7 +766,7 @@ function upgrade_260() { function upgrade_270() { global $wpdb, $wp_current_db_version; - if ( $wp_current_db_version < 8530 ) + if ( $wp_current_db_version < 8980 ) populate_roles_270(); // Update post_date for unpublished posts with empty timestamp diff --git a/wp-admin/themes.php b/wp-admin/themes.php index a75d7b9b23..134e38fe61 100644 --- a/wp-admin/themes.php +++ b/wp-admin/themes.php @@ -59,6 +59,32 @@ $page_links = paginate_links( array( $themes = array_slice( $themes, $start, $per_page ); +function theme_update_available( $theme ) { + static $themes_update; + if ( !isset($themes_update) ) + $themes_update = get_option('update_themes'); + + if ( isset($theme->stylesheet) ) + $stylesheet = $theme->stylesheet; + elseif ( isset($theme['Stylesheet']) ) + $stylesheet = $theme['Stylesheet']; + else + return false; //No valid info passed. + + if ( isset($themes_update->response[ $stylesheet ]) ) { + $update = $themes_update->response[ $stylesheet ]; + $details_url = add_query_arg(array('TB_iframe' => 'true', 'width' => 1024, 'height' => 800), $update['url']); //Theme browser inside WP? replace this, Also, theme preview JS will override this on the available list. + $update_url = wp_nonce_url('update.php?action=upgrade-theme&theme=' . urlencode($stylesheet), 'upgrade-theme_' . $stylesheet); + + if ( ! current_user_can('update_themes') ) + printf( __('

There is a new version of %1$s available. View version %3$s Details.

'), $ct->name, $details_url, $update['new_version']); + else if ( empty($update->package) ) + printf( __('

There is a new version of %1$s available. View version %3$s Details automatic upgrade unavailable for this theme.

'), $ct->name, $details_url, $update['new_version']); + else + printf( __('

There is a new version of %1$s available. View version %3$s Details or upgrade automatically.

'), $ct->name, $details_url, $update['new_version'], $update_url ); + } +} + ?>
@@ -77,6 +103,8 @@ $themes = array_slice( $themes, $start, $per_page ); tags ) : ?>

tags); ?>

+ +

@@ -141,8 +169,9 @@ foreach ( $cols as $col => $theme_name ) {

- + +
diff --git a/wp-admin/update.php b/wp-admin/update.php index 058b920adc..d4d7b522fa 100644 --- a/wp-admin/update.php +++ b/wp-admin/update.php @@ -61,6 +61,57 @@ function do_plugin_upgrade($plugin) { echo ''; } +/** + * Theme upgrade display. + * + * @since 2.5 + * + * @param string $plugin Plugin + */ +function do_theme_upgrade($theme) { + global $wp_filesystem; + + $url = wp_nonce_url('update.php?action=upgrade-theme&theme=' . urlencode($theme), 'upgrade-plugin_' . urlencode($theme)); + if ( false === ($credentials = request_filesystem_credentials($url)) ) + return; + + if ( ! WP_Filesystem($credentials) ) { + $error = true; + if ( is_object($wp_filesystem) && $wp_filesystem->errors->get_error_code() ) + $error = $wp_filesystem->errors; + request_filesystem_credentials($url, '', $error); //Failed to connect, Error and request again + return; + } + + echo '
'; + echo '

' . __('Upgrade Theme') . '

'; + if ( $wp_filesystem->errors->get_error_code() ) { + foreach ( $wp_filesystem->errors->get_error_messages() as $message ) + show_message($message); + echo '
'; + return; + } + + //TODO: Is theme currently active? + $was_current = false; //is_plugin_active($plugin); //Check now, It'll be deactivated by the next line if it is + + $result = wp_update_theme($theme, 'show_message'); + + if ( is_wp_error($result) ) { + show_message($result); + show_message( __('Installation Failed') ); + } else { + //Result is the new plugin file relative to WP_PLUGIN_DIR + show_message( __('Theme upgraded successfully') ); + if( $result && $was_current ){ + show_message(__('Setting theme as Current')); + //TODO: Actually set it as active again. + //echo ''; + } + } + echo ''; +} + /** * Display upgrade WordPress for downloading latest or upgrading automatically form. * @@ -144,15 +195,17 @@ function do_core_upgrade() { if ( isset($_GET['action']) ) { $plugin = isset($_GET['plugin']) ? trim($_GET['plugin']) : ''; - - if ( 'upgrade-plugin' == $_GET['action'] ) { + $theme = isset($_REQUEST['theme']) ? urldecode($_REQUEST['theme']) : ''; + $action = isset($_GET['action']) ? $_GET['action'] : ''; + + if ( 'upgrade-plugin' == $action ) { check_admin_referer('upgrade-plugin_' . $plugin); $title = __('Upgrade Plugin'); $parent_file = 'plugins.php'; require_once('admin-header.php'); do_plugin_upgrade($plugin); include('admin-footer.php'); - } elseif ('activate-plugin' == $_GET['action'] ) { + } elseif ('activate-plugin' == $action ) { check_admin_referer('activate-plugin_' . $plugin); if( ! isset($_GET['failure']) && ! isset($_GET['success']) ) { wp_redirect( 'update.php?action=activate-plugin&failure=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce'] ); @@ -182,19 +235,26 @@ wp_admin_css( 'colors', true ); include(WP_PLUGIN_DIR . '/' . $plugin); } echo ""; - } elseif ( 'upgrade-core' == $_GET['action'] ) { + } elseif ( 'upgrade-core' == $action ) { $title = __('Upgrade WordPress'); $parent_file = 'index.php'; require_once('admin-header.php'); core_upgrade_preamble(); include('admin-footer.php'); - } elseif ( 'do-core-upgrade' ) { + } elseif ( 'do-core-upgrade' == $action ) { check_admin_referer('upgrade-core'); $title = __('Upgrade WordPress'); $parent_file = 'index.php'; require_once('admin-header.php'); do_core_upgrade(); include('admin-footer.php'); + } elseif ( 'upgrade-theme' == $action ) { + check_admin_referer('upgrade-theme_' . $theme); + $title = __('Upgrade Theme'); + $parent_file = 'themes.php'; + require_once('admin-header.php'); + do_theme_upgrade($theme); + include('admin-footer.php'); } } diff --git a/wp-includes/version.php b/wp-includes/version.php index c7eb8b7537..55144edd80 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -15,6 +15,6 @@ $wp_version = '2.7-hemorrhage'; * * @global int $wp_db_version */ -$wp_db_version = 8921; +$wp_db_version = 8989; ?>