diff options
Diffstat (limited to 'wp-admin/includes/plugin.php')
-rw-r--r-- | wp-admin/includes/plugin.php | 122 |
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; |