diff --git a/wp-admin/css/colors-classic.css b/wp-admin/css/colors-classic.css
index 7c24900baa..10b2ac1b30 100644
--- a/wp-admin/css/colors-classic.css
+++ b/wp-admin/css/colors-classic.css
@@ -415,11 +415,11 @@ input.readonly {
background-color: #fff;
}
-#plugins .active {
+.plugins .active {
background-color: #BBEEBB;
}
-#plugins .togl {
+.plugins .togl {
border-right-color: #ccc;
}
@@ -427,7 +427,7 @@ input.readonly {
background-color: #ffffe0;
}
-#plugins tr {
+.plugins tr {
background-color: #fff;
}
diff --git a/wp-admin/css/colors-fresh.css b/wp-admin/css/colors-fresh.css
index 5d03380147..d901e4f751 100644
--- a/wp-admin/css/colors-fresh.css
+++ b/wp-admin/css/colors-fresh.css
@@ -384,11 +384,11 @@ input.readonly {
background-color: #fff;
}
-#plugins .active {
+.plugins .active {
background-color: #e7f7d3;
}
-#plugins .togl {
+.plugins .togl {
border-right-color: #ccc;
}
@@ -396,7 +396,7 @@ input.readonly {
background-color: #ffffe0;
}
-#plugins tr {
+.plugins tr {
background-color: #fff;
}
diff --git a/wp-admin/includes/plugin.php b/wp-admin/includes/plugin.php
index 3d9c01f425..f257e9b592 100644
--- a/wp-admin/includes/plugin.php
+++ b/wp-admin/includes/plugin.php
@@ -132,40 +132,100 @@ function deactivate_plugins($plugins, $silent= false) {
update_option('active_plugins', $current);
}
-function deactivate_all_plugins() {
- $current = get_option('active_plugins');
- if ( empty($current) )
- return;
-
- deactivate_plugins($current);
-
- update_option('deactivated_plugins', $current);
-}
-
-function reactivate_all_plugins($redirect = '') {
- $plugins = get_option('deactivated_plugins');
-
- if ( empty($plugins) )
- return;
-
- if ( !empty($redirect) )
- wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
+//Replaces reactivate_all_plugins() / deactivate_all_plugins() = 'deactivated_plugins' is now useless
+function activate_plugins($plugins, $redirect = '') {
+ if ( !is_array($plugins) )
+ $plugins = array($plugins);
$errors = array();
foreach ( (array) $plugins as $plugin ) {
- $result = activate_plugin($plugin);
+ if ( !empty($redirect) )
+ $redirect = add_query_arg('plugin', $plugin, $redirect);
+ $result = activate_plugin($plugin, $redirect);
if ( is_wp_error($result) )
$errors[$plugin] = $result;
}
- delete_option('deactivated_plugins');
-
if ( !empty($errors) )
return new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors);
return true;
}
+function delete_plugins($plugins, $redirect = '' ) {
+ global $wp_filesystem;
+
+ if( empty($plugins) )
+ return false;
+
+ $checked = array();
+ foreach( $plugins as $plugin )
+ $checked[] = 'checked[]=' . $plugin;
+
+ ob_start();
+ $url = wp_nonce_url('plugins.php?action=delete-selected&' . implode('&', $checked), 'mass-manage-plugins');
+ if ( false === ($credentials = request_filesystem_credentials($url)) ) {
+ $data = ob_get_contents();
+ ob_end_clean();
+ if( ! empty($data) ){
+ include_once( ABSPATH . 'wp-admin/admin-header.php');
+ echo $data;
+ include( ABSPATH . 'wp-admin/admin-footer.php');
+ exit;
+ }
+ return;
+ }
+
+ if ( ! WP_Filesystem($credentials) ) {
+ request_filesystem_credentials($url, '', true); //Failed to connect, Error and request again
+ $data = ob_get_contents();
+ ob_end_clean();
+ if( ! empty($data) ){
+ include_once( ABSPATH . 'wp-admin/admin-header.php');
+ echo $data;
+ include( ABSPATH . 'wp-admin/admin-footer.php');
+ exit;
+ }
+ return;
+ }
+
+ if ( $wp_filesystem->errors->get_error_code() ) {
+ return $wp_filesystem->errors;
+ }
+
+ 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.'));
+
+ $plugins_dir = trailingslashit( $plugins_dir );
+
+ $errors = array();
+
+ foreach( $plugins as $plugin_file ) {
+ $this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin_file) );
+ // If plugin is in its own directory, recursively delete the directory.
+ if ( strpos($plugin_file, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory seperator AND that its not the root plugin folder
+ $deleted = $wp_filesystem->delete($this_plugin_dir, true);
+ else
+ $deleted = $wp_filesystem->delete($plugins_dir . $plugin_file);
+
+ if ( ! $deleted )
+ $errors[] = $plugin_file;
+ }
+
+ if( ! empty($errors) )
+ return new WP_Error('could_not_remove_plugin', sprintf(__('Could not fully remove the plugin(s) %s'), implode(', ', $errors)) );
+
+ return true;
+}
+
function validate_active_plugins() {
$check_plugins = get_option('active_plugins');
diff --git a/wp-admin/includes/update.php b/wp-admin/includes/update.php
index a1585aca82..b0dab3ce43 100644
--- a/wp-admin/includes/update.php
+++ b/wp-admin/includes/update.php
@@ -118,25 +118,24 @@ function wp_update_plugins() {
}
add_action( 'load-plugins.php', 'wp_update_plugins' );
-function wp_plugin_update_row( $file ) {
- global $plugin_data;
+function wp_plugin_update_row( $file, $plugin_data ) {
$current = get_option( 'update_plugins' );
if ( !isset( $current->response[ $file ] ) )
return false;
$r = $current->response[ $file ];
- echo "
";
+ echo ' ';
if ( !current_user_can('edit_plugins') )
printf( __('There is a new version of %1$s available. Download version %3$s here .'), $plugin_data['Name'], $r->url, $r->new_version);
else if ( empty($r->package) )
printf( __('There is a new version of %1$s available. Download version %3$s here automatic upgrade unavailable for this plugin .'), $plugin_data['Name'], $r->url, $r->new_version);
else
- printf( __('There is a new version of %1$s available. Download version %3$s here or upgrade automatically .'), $plugin_data['Name'], $r->url, $r->new_version, wp_nonce_url("update.php?action=upgrade-plugin&plugin=$file", 'upgrade-plugin_' . $file) );
+ printf( __('There is a new version of %1$s available. Download version %3$s here or upgrade automatically .'), $plugin_data['Name'], $r->url, $r->new_version, wp_nonce_url('update.php?action=upgrade-plugin&plugin=' . $file, 'upgrade-plugin_' . $file) );
- echo " ";
+ echo '';
}
-add_action( 'after_plugin_row', 'wp_plugin_update_row' );
+add_action( 'after_plugin_row', 'wp_plugin_update_row', 10, 2 );
function wp_update_plugin($plugin, $feedback = '') {
global $wp_filesystem;
diff --git a/wp-admin/menu-header.php b/wp-admin/menu-header.php
index 0f2edc858f..90b6296957 100644
--- a/wp-admin/menu-header.php
+++ b/wp-admin/menu-header.php
@@ -2,6 +2,8 @@
$self = preg_replace('|^.*/wp-admin/|i', '', $_SERVER['PHP_SELF']);
$self = preg_replace('|^.*/plugins/|i', '', $self);
+global $menu, $submenu, $parent_file; //For when admin-header is included from within a function.
+
get_admin_page_parent();
// We're going to do this loop three times
diff --git a/wp-admin/plugins.php b/wp-admin/plugins.php
index d58d5745ae..b60406427f 100644
--- a/wp-admin/plugins.php
+++ b/wp-admin/plugins.php
@@ -1,41 +1,103 @@
get_error_message() );
- wp_redirect('plugins.php?activate=true'); // overrides the ?error=true one above
- } elseif ( 'error_scrape' == $_GET['action'] ) {
- check_admin_referer('plugin-activation-error_' . $plugin);
- $valid = validate_plugin($plugin);
- if ( is_wp_error($valid) )
- wp_die($valid);
- error_reporting( E_ALL ^ E_NOTICE );
- @ini_set('display_errors', true); //Ensure that Fatal errors are displayed.
- include(WP_PLUGIN_DIR . '/' . $plugin);
- } elseif ( 'deactivate' == $_GET['action'] ) {
- check_admin_referer('deactivate-plugin_' . $_GET['plugin']);
- deactivate_plugins($_GET['plugin']);
- wp_redirect('plugins.php?deactivate=true');
- } elseif ( 'deactivate-all' == $_GET['action'] ) {
- check_admin_referer('deactivate-all');
- deactivate_all_plugins();
- wp_redirect('plugins.php?deactivate-all=true');
- } elseif ('reactivate-all' == $_GET['action']) {
- check_admin_referer('reactivate-all');
- reactivate_all_plugins('plugins.php?errors=true');
- wp_redirect('plugins.php?reactivate-all=true'); // overrides the ?error=true one above
+$action = '';
+foreach( array('activate-selected', 'deactivate-selected', 'delete-selected') as $action_key ) {
+ if( isset($_POST[$action_key]) ) {
+ $action = $action_key;
+ break;
}
-
- exit;
}
+if( isset($_GET['action']) )
+ $action = $_GET['action'];
+
+$plugin = $_REQUEST['plugin'];
+
+if( !empty($action) ) {
+ switch( $action ) {
+ case 'activate':
+ check_admin_referer('activate-plugin_' . $plugin);
+ $result = activate_plugin($plugin, 'plugins.php?error=true&plugin=' . $plugin);
+ if ( is_wp_error( $result ) )
+ wp_die( $result->get_error_message() );
+ $recent = (array)get_option('recently_activated');
+ if( isset($recent[ $plugin ]) ){
+ unset($recent[ $plugin ]);
+ update_option('recently_activated', $recent);
+ }
+ wp_redirect('plugins.php?activate=true'); // overrides the ?error=true one above
+ exit;
+ break;
+ case 'activate-selected':
+ check_admin_referer('mass-manage-plugins');
+ activate_plugins($_POST['checked'], 'plugins.php?error=true');
+
+ $recent = (array)get_option('recently_activated');
+ foreach( (array)$_POST['checked'] as $plugin => $time) {
+ if( isset($recent[ $plugin ]) )
+ unset($recent[ $plugin ]);
+ }
+ if( $recent != get_option('recently_activated') ) //If array changed, update it.
+ update_option('recently_activated', $recent);
+
+ wp_redirect('plugins.php?activate-multi=true');
+ exit;
+ break;
+ case 'error_scrape':
+ check_admin_referer('plugin-activation-error_' . $plugin);
+ $valid = validate_plugin($plugin);
+ if ( is_wp_error($valid) )
+ wp_die($valid);
+ error_reporting( E_ALL ^ E_NOTICE );
+ @ini_set('display_errors', true); //Ensure that Fatal errors are displayed.
+ include(WP_PLUGIN_DIR . '/' . $plugin);
+ exit;
+ break;
+ case 'deactivate':
+ check_admin_referer('deactivate-plugin_' . $plugin);
+ deactivate_plugins($plugin);
+ update_option('recently_activated', array($plugin => time()) + (array)get_option('recently_activated'));
+ wp_redirect('plugins.php?deactivate=true');
+ exit;
+ break;
+ case 'deactivate-selected':
+ check_admin_referer('mass-manage-plugins');
+ deactivate_plugins($_POST['checked']);
+ $deactivated = array();
+ foreach( (array)$_POST['checked'] as $plugin )
+ $deactivated[ $plugin ] = time();
+ update_option('recently_activated', $deactivated + (array)get_option('recently_activated'));
+ wp_redirect('plugins.php?deactivate-multi=true');
+ exit;
+ break;
+ case 'delete-selected':
+ check_admin_referer('mass-manage-plugins');
+ $plugins = $_REQUEST['checked'];
+ include(ABSPATH . 'wp-admin/update.php');
+
+ $title = __('Delete Plugin');
+ $parent_file = 'plugins.php';
+
+ $delete_result = delete_plugins($plugins);
+
+ //HACK TIME!
+ // Proper way needed, perhaps get_plugins() to convert to wp_cache_get() any reason why it hasnt allready?
+ // This clears the cached plugin list
+ global $wp_plugins;
+ $wp_plugins = null;
+
+
+
+ //TODO: Implement!.. STAT!
+ break;
+ default:
+ var_dump("Unknown Action $action");
+ }
+}
+
+wp_enqueue_script('admin-forms');
+
$title = __('Manage Plugins');
require_once('admin-header.php');
@@ -46,23 +108,26 @@ validate_active_plugins();
-
-
+
+ get_error_message() ); ?>
+
+
+
+
+
-
-
-
-
+
+
@@ -70,104 +135,147 @@ validate_active_plugins();
$time )
+ if( $time + (7*24*60*60) < time() ) //1 week
+ unset($recently_activated[ $key ]);
+if( $recently_activated != get_option('recently_activated') ) //If array changed, update it.
+ update_option('recently_activated', $recently_activated);
+
+$all_plugins = get_plugins();
+
+$plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
+
+foreach( (array)$all_plugins as $plugin_file => $plugin_data) {
+
+ // Sanitize all displayed data
+ $plugin_data['Title'] = wp_kses($plugin_data['Title'], $plugins_allowedtags);
+ $plugin_data['Version'] = wp_kses($plugin_data['Version'], $plugins_allowedtags);
+ $plugin_data['Description'] = wp_kses($plugin_data['Description'], $plugins_allowedtags);
+ $plugin_data['Author'] = wp_kses($plugin_data['Author'], $plugins_allowedtags);
+ if( ! empty($plugin_data['Author']) )
+ $plugin_data['Description'] .= '
' . sprintf( __('By %s'), $plugin_data['Author'] ) . '. ';
+
+ if ( is_plugin_active($plugin_file) ) {
+ $active_plugins[ $plugin_file ] = $plugin_data;
+ } else {
+ if ( isset( $recently_activated[ $plugin_file ] ) ) //Was the plugin recently activated?
+ $recent_plugins[ $plugin_file ] = $plugin_data;
+ else
+ $available_plugins[ $plugin_file ] = $plugin_data;
+ }
+}
-if (empty($plugins)) {
- echo '
';
- _e("Couldn’t open plugins directory or there are no plugins available."); // TODO: make more helpful
- echo '
';
-} else {
?>
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
$plugin_data) {
+
+ if( empty($plugins) ) {
+ echo '
+ ' . __('No plugins to show') . '
+ ';
+ }
+ foreach( (array)$plugins as $plugin_file => $plugin_data) {
$action_links = array();
-
- $style = '';
- if ( is_plugin_active($plugin_file) ) {
- $action_links[] = "".__('Deactivate')." ";
- $style = 'active';
- } else {
- $action_links[] = "".__('Activate')." ";
- }
+ if( 'active' == $context )
+ $action_links[] = '' . __('Deactivate') . ' ';
+ else //Available or Recently deactivated
+ $action_links[] = '' . __('Activate') . ' ';
+
if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )
- $action_links[] = "".__('Edit')." ";
+ $action_links[] = '' . __('Edit') . ' ';
- $plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
-
- // Sanitize all displayed data
- $plugin_data['Title'] = wp_kses($plugin_data['Title'], $plugins_allowedtags);
- $plugin_data['Version'] = wp_kses($plugin_data['Version'], $plugins_allowedtags);
- $plugin_data['Description'] = wp_kses($plugin_data['Description'], $plugins_allowedtags);
- $plugin_data['Author'] = wp_kses($plugin_data['Author'], $plugins_allowedtags);
- $author = ( empty($plugin_data['Author']) ) ? '' : ' ' . sprintf( __('By %s'), $plugin_data['Author'] ) . '. ';
-
- if ( $style != '' )
- $style = ' class="' . $style . '"';
-
- $action_links = apply_filters('plugin_action_links', $action_links, $plugin_file, $plugin_info);
+ $action_links = apply_filters('plugin_action_links', $action_links, $plugin_file, $plugin_data, $context);
echo "
-
+
+
{$plugin_data['Title']}
{$plugin_data['Version']}
- {$plugin_data['Description']}$author
- ";
- if ( is_plugin_active($plugin_file) )
- echo __('Active ');
- else
- _e('Inactive ');
- echo "
- $toggle";
+ {$plugin_data['Description']}
+ ";
if ( !empty($action_links) )
echo implode(' | ', $action_links);
- echo "
- ";
- do_action( 'after_plugin_row', $plugin_file );
+ echo '
+ ';
+ do_action( 'after_plugin_row', $plugin_file, $plugin_data, $context );
}
?>
-
-
+
+
+
%s directory and it will be automatically deactivated.'), WP_PLUGIN_DIR); ?>
+
+
+
+
+
+
+
+
WordPress plugin directory.'); ?>
%s directory. Once a plugin is uploaded, you may activate it here.'), WP_PLUGIN_DIR); ?>
diff --git a/wp-admin/wp-admin.css b/wp-admin/wp-admin.css
index df7783f77a..585937e178 100644
--- a/wp-admin/wp-admin.css
+++ b/wp-admin/wp-admin.css
@@ -1,13 +1,13 @@
-#plugins .name {
+.plugins .name {
font-weight: bold;
}
-#plugins p {
+.plugins p {
margin: 0 4px;
padding: 0;
}
-#plugins .togl {
+.plugins .togl {
width: 150px;
border-right-width: 1px;
border-right-style: solid;