- tested, '>') )
+ echo '
' . __('Warning: This plugin has not been tested with your current version of WordPress.') . '
';
+ else if ( version_compare($GLOBALS['wp_version'], $api->requires, '<') )
+ echo '
' . __('Warning: This plugin has not been marked as being not compatible with your version of WordPress.') . '
';
foreach ( (array)$api->sections as $section_name => $content ) {
$title = $section_name;
$title[0] = strtoupper($title[0]);
@@ -520,17 +464,51 @@ function install_plugin_information() {
$display = ( $section_name == $section ) ? 'block' : 'none';
- echo "\t
\n";
+ echo "\t
\n";
echo "\t\t";
echo $content;
echo "\t
\n";
}
echo "
\n";
+ iframe_footer();
exit;
}
-add_action('install_plugins_pre_install', 'install_plugin');
+
+add_action('install_plugins_upload', 'upload_plugin');
+function upload_plugin() {
+
+ if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )
+ wp_die($uploads['error']);
+
+ if ( !empty($_FILES) )
+ $filename = $_FILES['pluginzip']['name'];
+ else if ( isset($_GET['package']) )
+ $filename = $_GET['package'];
+
+ check_admin_referer('plugin-upload');
+
+ echo '
';
+ echo '
', sprintf( __('Installing Plugin from file: %s'), basename($filename) ), '
';
+
+ //Handle a newly uploaded file, Else assume it was
+ if ( !empty($_FILES) ) {
+ $filename = wp_unique_filename( $uploads['basedir'], $filename );
+ $local_file = $uploads['basedir'] . '/' . $filename;
+
+ // Move the file to the uploads dir
+ if ( false === @ move_uploaded_file( $_FILES['pluginzip']['tmp_name'], $local_file) )
+ wp_die( sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path']));
+ } else {
+ $local_file = $uploads['basedir'] . '/' . $filename;
+ }
+
+ do_plugin_install_local_package($local_file, $filename);
+ echo '';
+}
+
+add_action('install_plugins_install', 'install_plugin');
/**
* Display plugin link and execute install.
@@ -542,9 +520,6 @@ function install_plugin() {
$plugin = isset($_REQUEST['plugin']) ? $_REQUEST['plugin'] : '';
check_admin_referer('install-plugin_' . $plugin);
-
- install_iframe_header();
-
$api = plugins_api('plugin_information', array('slug' => $plugin, 'fields' => array('sections' => false) ) ); //Save on a bit of bandwidth.
echo '
';
@@ -553,7 +528,6 @@ function install_plugin() {
do_plugin_install($api->download_link, $api);
echo '
';
- exit;
}
/**
@@ -561,10 +535,10 @@ function install_plugin() {
*
* @since 2.7.0
*
- * @param string $download_url Optional. Download URL.
+ * @param string $download_url Download URL.
* @param object $plugin_information Optional. Plugin information
*/
-function do_plugin_install($download_url = '', $plugin_information = null) {
+function do_plugin_install($download_url, $plugin_information = null) {
global $wp_filesystem;
if ( empty($download_url) ) {
@@ -602,12 +576,67 @@ function do_plugin_install($download_url = '', $plugin_information = null) {
$plugin_file = $result;
$install_actions = apply_filters('install_plugin_complete_actions', array(
- 'activate_plugin' => '
' . __('Activate Plugin') . '',
- 'plugins_page' => '
' . __('Return to Plugins page') . '',
- 'dismiss_dialog' => '
' . __('Dismiss Dialog') . ''
+ 'activate_plugin' => '
' . __('Activate Plugin') . '',
+ 'plugins_page' => '
' . __('Return to Plugins page') . ''
), $plugin_information, $plugin_file);
+ if ( ! empty($install_actions) )
+ show_message('
' . __('Actions:') . '' . implode(' | ', (array)$install_actions));
+ }
+}
- echo '
' . __('Actions:') . '' . implode(' | ', (array)$install_actions) . '
';
+/**
+ * Install a plugin from a local file.
+ *
+ * @since 2.7.0
+ *
+ * @param string $package Local Plugin zip
+ * @param string $filename Optional. Original filename
+ * @param object $plugin_information Optional. Plugin information
+ */
+function do_plugin_install_local_package($package, $filename = '') {
+ global $wp_filesystem;
+
+ if ( empty($package) ) {
+ show_message( __('No plugin Specified') );
+ return;
+ }
+
+ if ( empty($filename) )
+ $filename = basename($package);
+
+ $url = 'plugin-install.php?tab=upload';
+ $url = add_query_arg(array('package' => $filename), $url);
+
+ $url = wp_nonce_url($url, 'plugin-upload');
+ if ( false === ($credentials = request_filesystem_credentials($url)) )
+ return;
+
+ if ( ! WP_Filesystem($credentials) ) {
+ request_filesystem_credentials($url, '', true); //Failed to connect, Error and request again
+ return;
+ }
+
+ if ( $wp_filesystem->errors->get_error_code() ) {
+ foreach ( $wp_filesystem->errors->get_error_messages() as $message )
+ show_message($message);
+ return;
+ }
+
+ $result = wp_install_plugin_local_package( $package, 'show_message' );
+
+ if ( is_wp_error($result) ) {
+ show_message($result);
+ show_message( __('Installation Failed') );
+ } else {
+ show_message( __('Successfully installed the plugin.') );
+ $plugin_file = $result;
+
+ $install_actions = apply_filters('install_plugin_complete_actions', array(
+ 'activate_plugin' => '
' . __('Activate Plugin') . '',
+ 'plugins_page' => '
' . __('Return to Plugins page') . ''
+ ), $plugin_information, $plugin_file);
+ if ( ! empty($install_actions) )
+ show_message('
' . __('Actions:') . '' . implode(' | ', (array)$install_actions));
}
}
@@ -670,7 +699,102 @@ function wp_install_plugin($package, $feedback = '') {
$result = unzip_file($download_file, $working_dir);
// Once extracted, delete the package
- unlink($download_file);
+ @unlink($download_file);
+
+ 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) );
+
+ if( $wp_filesystem->exists( $plugins_dir . $filelist[0] ) ) {
+ $wp_filesystem->delete($working_dir, true);
+ return new WP_Error('install_folder_exists', __('Folder allready exists.'), $filelist[0] );
+ }
+
+ apply_filters('install_feedback', __('Installing the plugin'));
+ // 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);
+ 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);
+
+ 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 the plugin files name.
+ return $folder . '/' . $pluginfiles[0];
+}
+
+/**
+ * Install plugin from local package
+ *
+ * @since 2.7.0
+ *
+ * @param string $package
+ * @param string $feedback Optional.
+ * @return mixed.
+ */
+function wp_install_plugin_local_package($package, $feedback = '') {
+ global $wp_filesystem;
+
+ if ( !empty($feedback) )
+ add_filter('install_feedback', $feedback);
+
+ // 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 );
+
+ if ( empty($package) )
+ return new WP_Error('no_package', __('Install package not available.'));
+
+ 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($package, '.zip');
+
+ // Clean up working directory
+ if ( $wp_filesystem->is_dir($working_dir) )
+ $wp_filesystem->delete($working_dir, true);
+
+ apply_filters('install_feedback', __('Unpacking the plugin package'));
+ // Unzip package to working directory
+ $result = unzip_file($package, $working_dir);
+
+ // Once extracted, delete the package
+ unlink($package);
if ( is_wp_error($result) ) {
$wp_filesystem->delete($working_dir, true);
@@ -711,4 +835,5 @@ function wp_install_plugin($package, $feedback = '') {
}
-?>
\ No newline at end of file
+
+?>
diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php
index 150eb6606c..be2c211390 100644
--- a/wp-admin/includes/template.php
+++ b/wp-admin/includes/template.php
@@ -3064,7 +3064,54 @@ function _draft_or_post_title($post_id = 0)
*
*/
function _admin_search_query() {
- echo ( isset($_GET['s']) ) ? attribute_escape( stripslashes( $_GET['s'] ) ) : '';
+ echo isset($_GET['s']) ? attribute_escape( stripslashes( $_GET['s'] ) ) : '';
+}
+
+/**
+ * Generic Iframe header for use with Thickbox
+ *
+ * @since 2.7.0
+ * @param string $title Title of the Iframe page.
+ * @param bool $limit_styles Limit styles to colour-related styles only (unless others are enqueued).
+ *
+ */
+function iframe_header( $title = '', $limit_styles = false) {
+?>
+ >
+
+
+
› —
+
+
+
+
+>
+
+';
}
?>
diff --git a/wp-admin/js/plugin-install.js b/wp-admin/js/plugin-install.js
index f1691d5cfb..ed7659d417 100644
--- a/wp-admin/js/plugin-install.js
+++ b/wp-admin/js/plugin-install.js
@@ -46,7 +46,7 @@ jQuery(function($) {
$('#plugin-information-header a.current').removeClass('current');
$(this).addClass('current');
//Flip the content.
- $('#section-holder div').hide(); //Hide 'em all
+ $('#section-holder div.section').hide(); //Hide 'em all
$('#section-' + tab).show();
return false;
});
diff --git a/wp-admin/update.php b/wp-admin/update.php
index 86f2f12b82..995aab17ea 100644
--- a/wp-admin/update.php
+++ b/wp-admin/update.php
@@ -49,14 +49,24 @@ function do_plugin_upgrade($plugin) {
if ( is_wp_error($result) ) {
show_message($result);
- show_message( __('Installation Failed') );
+ show_message( __('Plugin upgrade Failed') );
} else {
- //Result is the new plugin file relative to WP_PLUGIN_DIR
+ $plugin_file = $result;
show_message( __('Plugin upgraded successfully') );
if( $result && $was_activated ){
show_message(__('Attempting reactivation of the plugin'));
- echo '
';
+ echo '
';
}
+ $update_actions = array(
+ 'activate_plugin' => '
' . __('Activate Plugin') . '',
+ 'plugins_page' => '
' . __('Return to Plugins page') . ''
+ );
+ if ( $was_activated )
+ unset( $update_actions['activate_plugin'] );
+
+ $update_actions = apply_filters('update_plugin_complete_actions', $update_actions, $plugin_file);
+ if ( ! empty($update_actions) )
+ show_message('
' . __('Actions:') . '' . implode(' | ', (array)$update_actions));
}
echo '
';
}
@@ -207,7 +217,7 @@ if ( isset($_GET['action']) ) {
if ( 'upgrade-plugin' == $action ) {
check_admin_referer('upgrade-plugin_' . $plugin);
$title = __('Upgrade Plugin');
- $parent_file = 'plugins.php';
+ $parent_file = 'index.php';
require_once('admin-header.php');
do_plugin_upgrade($plugin);
include('admin-footer.php');
@@ -219,18 +229,7 @@ if ( isset($_GET['action']) ) {
wp_redirect( 'update.php?action=activate-plugin&success=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce'] );
die();
}
- ?>
- >
-
-