summaryrefslogtreecommitdiffstats
path: root/wp-admin/includes/plugin.php
diff options
context:
space:
mode:
Diffstat (limited to 'wp-admin/includes/plugin.php')
-rw-r--r--wp-admin/includes/plugin.php122
1 files changed, 93 insertions, 29 deletions
diff --git a/wp-admin/includes/plugin.php b/wp-admin/includes/plugin.php
index a862c51..3afaed9 100644
--- a/wp-admin/includes/plugin.php
+++ b/wp-admin/includes/plugin.php
@@ -32,14 +32,15 @@ function get_plugin_data( $plugin_file ) {
}
function get_plugins($plugin_folder = '') {
- global $wp_plugins;
-
- if ( isset( $wp_plugins ) ) {
- return $wp_plugins;
- }
-
+
+ if ( ! $cache_plugins = wp_cache_get('plugins', 'plugins') )
+ $cached_plugins = array();
+
+ if ( isset($cache_plugins[ $plugin_folder ]) )
+ return $cache_plugins[ $plugin_folder ];
+
$wp_plugins = array ();
- $plugin_root = ABSPATH . PLUGINDIR;
+ $plugin_root = WP_PLUGIN_DIR;
if( !empty($plugin_folder) )
$plugin_root .= $plugin_folder;
@@ -85,6 +86,9 @@ function get_plugins($plugin_folder = '') {
uasort( $wp_plugins, create_function( '$a, $b', 'return strnatcasecmp( $a["Name"], $b["Name"] );' ));
+ $cache_plugins[ $plugin_folder ] = $wp_plugins;
+ wp_cache_set('plugins', $cache_plugins, 'plugins');
+
return $wp_plugins;
}
@@ -104,7 +108,7 @@ function activate_plugin($plugin, $redirect = '') {
if ( !empty($redirect) )
wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error
ob_start();
- @include(ABSPATH . PLUGINDIR . '/' . $plugin);
+ @include(WP_PLUGIN_DIR . '/' . $plugin);
$current[] = $plugin;
sort($current);
update_option('active_plugins', $current);
@@ -132,37 +136,97 @@ function deactivate_plugins($plugins, $silent= false) {
update_option('active_plugins', $current);
}
-function deactivate_all_plugins() {
- $current = get_option('active_plugins');
- if ( empty($current) )
- return;
+//Replaces reactivate_all_plugins() / deactivate_all_plugins() = 'deactivated_plugins' is now useless
+function activate_plugins($plugins, $redirect = '') {
+ if ( !is_array($plugins) )
+ $plugins = array($plugins);
- deactivate_plugins($current);
+ $errors = array();
+ foreach ( (array) $plugins as $plugin ) {
+ if ( !empty($redirect) )
+ $redirect = add_query_arg('plugin', $plugin, $redirect);
+ $result = activate_plugin($plugin, $redirect);
+ if ( is_wp_error($result) )
+ $errors[$plugin] = $result;
+ }
- update_option('deactivated_plugins', $current);
+ if ( !empty($errors) )
+ return new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors);
+
+ return true;
}
-function reactivate_all_plugins($redirect = '') {
- $plugins = get_option('deactivated_plugins');
+function delete_plugins($plugins, $redirect = '' ) {
+ global $wp_filesystem;
- if ( empty($plugins) )
+ 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 ( !empty($redirect) )
- wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
+ 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;
+ }
- $errors = array();
- foreach ( (array) $plugins as $plugin ) {
- $result = activate_plugin($plugin);
- if ( is_wp_error($result) )
- $errors[$plugin] = $result;
+ if ( $wp_filesystem->errors->get_error_code() ) {
+ return $wp_filesystem->errors;
}
- delete_option('deactivated_plugins');
+ if ( ! is_object($wp_filesystem) )
+ return new WP_Error('fs_unavailable', __('Could not access filesystem.'));
- if ( !empty($errors) )
- return new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors);
+ 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;
}
@@ -179,7 +243,7 @@ function validate_active_plugins() {
// If a plugin file does not exist, remove it from the list of active
// plugins.
foreach ( $check_plugins as $check_plugin ) {
- if ( !file_exists(ABSPATH . PLUGINDIR . '/' . $check_plugin) ) {
+ if ( !file_exists(WP_PLUGIN_DIR . '/' . $check_plugin) ) {
$current = get_option('active_plugins');
$key = array_search($check_plugin, $current);
if ( false !== $key && NULL !== $key ) {
@@ -193,7 +257,7 @@ function validate_active_plugins() {
function validate_plugin($plugin) {
if ( validate_file($plugin) )
return new WP_Error('plugin_invalid', __('Invalid plugin.'));
- if ( ! file_exists(ABSPATH . PLUGINDIR . '/' . $plugin) )
+ if ( ! file_exists(WP_PLUGIN_DIR . '/' . $plugin) )
return new WP_Error('plugin_not_found', __('Plugin file does not exist.'));
return 0;