ID, 'plugins_last_view', $status); $page = isset($_REQUEST['paged']) ? $_REQUEST['paged'] : 1; //Clean up request URI from temporary args for screen options/paging uri's to work as expected. $_SERVER['REQUEST_URI'] = remove_query_arg(array('error', 'deleted', 'activate', 'activate-multi', 'deactivate', 'deactivate-multi', '_error_nonce'), $_SERVER['REQUEST_URI']); if ( !empty($action) ) { $network_wide = false; if ( ( isset( $_GET['networkwide'] ) || 'network-activate-selected' == $action ) && is_multisite() && is_super_admin() ) $network_wide = true; switch ( $action ) { case 'activate': if ( ! current_user_can('activate_plugins') ) wp_die(__('You do not have sufficient permissions to activate plugins for this blog.')); check_admin_referer('activate-plugin_' . $plugin); $result = activate_plugin($plugin, 'plugins.php?error=true&plugin=' . $plugin, $network_wide); if ( is_wp_error( $result ) ) { if ('unexpected_output' == $result->get_error_code()) { $redirect = 'plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . $plugin; wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); exit; } else { wp_die($result); } } $recent = (array)get_option('recently_activated'); if ( isset($recent[ $plugin ]) ) { unset($recent[ $plugin ]); update_option('recently_activated', $recent); } wp_redirect("plugins.php?activate=true&plugin_status=$status&paged=$page"); // overrides the ?error=true one above exit; break; case 'activate-selected': case 'network-activate-selected': if ( ! current_user_can('activate_plugins') ) wp_die(__('You do not have sufficient permissions to activate plugins for this blog.')); check_admin_referer('bulk-manage-plugins'); $plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array(); $plugins = array_filter($plugins, create_function('$plugin', 'return !is_plugin_active($plugin);') ); // Only activate plugins which are not already active. if ( empty($plugins) ) { wp_redirect("plugins.php?plugin_status=$status&paged=$page"); exit; } activate_plugins($plugins, 'plugins.php?error=true', $network_wide); $recent = (array)get_option('recently_activated'); foreach ( $plugins as $plugin => $time) if ( isset($recent[ $plugin ]) ) unset($recent[ $plugin ]); update_option('recently_activated', $recent); wp_redirect("plugins.php?activate-multi=true&plugin_status=$status&paged=$page"); exit; break; case 'update-selected' : if ( ! current_user_can( 'update_plugins' ) ) wp_die( __( 'You do not have sufficient permissions to update plugins for this blog.' ) ); check_admin_referer( 'bulk-manage-plugins' ); if ( isset( $_GET['plugins'] ) ) $plugins = explode( ',', $_GET['plugins'] ); elseif ( isset( $_POST['checked'] ) ) $plugins = (array) $_POST['checked']; else break; if ( empty( $plugins ) ) break; // We'll be passing all checked plugins as long as at least one is out of date. $_plugins = $plugins; $current = get_site_transient( 'update_plugins' ); foreach ( $_plugins as $k => $v ) { if ( ! isset( $current->response[ $v ] ) ) unset( $_plugins[ $k ] ); } unset( $current ); // If all checked plugins are up to date if ( empty( $_plugins ) ) break; require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' ); require_once( 'admin-header.php' ); $url = 'plugins.php?action=upgrade-selected&plugins=' . urlencode( join( ',', $plugins ) ); $title = __( 'Upgrade Plugins' ); $nonce = 'bulk-manage-plugins'; $parent_file = 'plugins.php'; $upgrader = new Plugin_Upgrader( new Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url' ) ) ); $upgrader->bulk_upgrade( $plugins ); require_once( 'admin-footer.php' ); exit; break; case 'error_scrape': if ( ! current_user_can('activate_plugins') ) wp_die(__('You do not have sufficient permissions to activate plugins for this blog.')); check_admin_referer('plugin-activation-error_' . $plugin); $valid = validate_plugin($plugin); if ( is_wp_error($valid) ) wp_die($valid); if ( ! WP_DEBUG ) { if ( defined('E_RECOVERABLE_ERROR') ) error_reporting(E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR); else error_reporting(E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING); } @ini_set('display_errors', true); //Ensure that Fatal errors are displayed. // Go back to "sandbox" scope so we get the same errors as before function plugin_sandbox_scrape( $plugin ) { include( WP_PLUGIN_DIR . '/' . $plugin ); } plugin_sandbox_scrape( $plugin ); do_action('activate_' . $plugin); exit; break; case 'deactivate': if ( ! current_user_can('activate_plugins') ) wp_die(__('You do not have sufficient permissions to deactivate plugins for this blog.')); check_admin_referer('deactivate-plugin_' . $plugin); deactivate_plugins($plugin); update_option('recently_activated', array($plugin => time()) + (array)get_option('recently_activated')); if (headers_sent()) echo ""; else wp_redirect("plugins.php?deactivate=true&plugin_status=$status&paged=$page"); exit; break; case 'deactivate-selected': if ( ! current_user_can('activate_plugins') ) wp_die(__('You do not have sufficient permissions to deactivate plugins for this blog.')); check_admin_referer('bulk-manage-plugins'); $plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array(); $plugins = array_filter($plugins, 'is_plugin_active'); //Do not deactivate plugins which are already deactivated. if ( empty($plugins) ) { wp_redirect("plugins.php?plugin_status=$status&paged=$page"); exit; } deactivate_plugins($plugins); $deactivated = array(); foreach ( $plugins as $plugin ) $deactivated[ $plugin ] = time(); update_option('recently_activated', $deactivated + (array)get_option('recently_activated')); wp_redirect("plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page"); exit; break; case 'delete-selected': if ( ! current_user_can('delete_plugins') ) wp_die(__('You do not have sufficient permissions to delete plugins for this blog.')); check_admin_referer('bulk-manage-plugins'); //$_POST = from the plugin form; $_GET = from the FTP details screen. $plugins = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array(); $plugins = array_filter($plugins, create_function('$plugin', 'return !is_plugin_active($plugin);') ); //Do not allow to delete Activated plugins. if ( empty($plugins) ) { wp_redirect("plugins.php?plugin_status=$status&paged=$page"); exit; } include(ABSPATH . 'wp-admin/update.php'); $parent_file = 'plugins.php'; if ( ! isset($_REQUEST['verify-delete']) ) { wp_enqueue_script('jquery'); require_once('admin-header.php'); ?>
$data ) { $plugin_info[ $plugin_file ] = $data; $plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin ); } } } } screen_icon(); $plugins_to_delete = count( $plugin_info ); echo '

' . _n( 'Delete Plugin', 'Delete Plugins', $plugins_to_delete ) . '

'; ?>

'; ?>

' . __('Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.') . '

'; if ( current_user_can('edit_plugins') ) { $help .= '

' . sprintf(__('If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated.'), WP_PLUGIN_DIR) . '

'; $help .= '

' . sprintf(__('You can find additional plugins for your site by using the new Plugin Browser/Installer functionality or by browsing the WordPress Plugin Directory directly and installing manually. To manually install a plugin you generally just need to upload the plugin file into your %2$s directory. Once a plugin has been installed, you may activate it here.'), 'plugin-install.php', WP_PLUGIN_DIR) . '

'; } add_contextual_help($current_screen, $help); if ( is_multisite() && is_super_admin() ) { $menu_perms = get_site_option('menu_items', array()); if ( empty($menu_perms['plugins']) ) add_action( 'admin_notices', '_admin_notice_multisite_activate_plugins_page' ); unset($menu_perms); } $title = __('Manage Plugins'); require_once('admin-header.php'); $invalid = validate_active_plugins(); if ( !empty($invalid) ) foreach ( $invalid as $plugin_file => $error ) echo '

' . sprintf(__('The plugin %s has been deactivated due to an error: %s'), esc_html($plugin_file), $error->get_error_message()) . '

'; ?> unexpected output.'), $_GET['charsout']); else $errmsg = __('Plugin could not be activated because it triggered a fatal error.'); ?>

get_error_message() ); ?>

deleted.'); ?>

activated.') ?>

activated.'); ?>

deactivated.') ?>

deactivated.'); ?>

$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); $current = get_site_transient( 'update_plugins' ); foreach ( array( 'all_plugins', 'mustuse_plugins', 'dropins_plugins' ) as $plugin_array_name) { foreach ( (array) $$plugin_array_name as $plugin_file => $plugin_data ) { // Translate, Apply Markup, Sanitize HTML $plugin_data = _get_plugin_data_markup_translate($plugin_file, $plugin_data, false, true); $$plugin_array_name[ $plugin_file ] = $plugin_data; } } unset( $plugin_array_name ); foreach ( (array) $all_plugins as $plugin_file => $plugin_data) { // Filter into individual sections if ( is_plugin_active_for_network($plugin_file) ) { if ( is_super_admin() ) $network_plugins[ $plugin_file ] = $plugin_data; } elseif ( 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; $inactive_plugins[ $plugin_file ] = $plugin_data; } if ( isset( $current->response[ $plugin_file ] ) ) $upgrade_plugins[ $plugin_file ] = $plugin_data; } if ( !current_user_can('update_plugins') ) $upgrade_plugins = array(); $total_all_plugins = count($all_plugins); $total_inactive_plugins = count($inactive_plugins); $total_active_plugins = count($active_plugins); $total_recent_plugins = count($recent_plugins); $total_upgrade_plugins = count($upgrade_plugins); $total_network_plugins = count($network_plugins); $total_mustuse_plugins = count($mustuse_plugins); $total_dropins_plugins = count($dropins_plugins); //Searching. if ( isset($_GET['s']) ) { function _search_plugins_filter_callback($plugin) { static $term; if ( is_null($term) ) $term = stripslashes($_GET['s']); if ( stripos($plugin['Name'], $term) !== false || stripos($plugin['Description'], $term) !== false || stripos($plugin['Author'], $term) !== false || stripos($plugin['PluginURI'], $term) !== false || stripos($plugin['AuthorURI'], $term) !== false || stripos($plugin['Version'], $term) !== false ) return true; else return false; } $status = 'search'; $search_plugins = array_filter($all_plugins, '_search_plugins_filter_callback'); $total_search_plugins = count($search_plugins); } $plugin_array_name = "${status}_plugins"; if ( empty($$plugin_array_name) && $status != 'all' ) { $status = 'all'; $plugin_array_name = "${status}_plugins"; } $plugins = &$$plugin_array_name; // Paging. $total_this_page = "total_{$status}_plugins"; $total_this_page = $$total_this_page; $plugins_per_page = (int) get_user_option( 'plugins_per_page' ); if ( empty( $plugins_per_page ) || $plugins_per_page < 1 ) $plugins_per_page = 999; $plugins_per_page = apply_filters( 'plugins_per_page', $plugins_per_page ); $start = ($page - 1) * $plugins_per_page; $page_links = paginate_links( array( 'base' => add_query_arg( 'paged', '%#%' ), 'format' => '', 'prev_text' => __('«'), 'next_text' => __('»'), 'total' => ceil($total_this_page / $plugins_per_page), 'current' => $page )); $page_links_text = sprintf( '' . __( 'Displaying %s–%s of %s' ) . '%s', number_format_i18n( $start + 1 ), number_format_i18n( min( $page * $plugins_per_page, $total_this_page ) ), '' . number_format_i18n( $total_this_page ) . '', $page_links ); /** * @ignore * * @param array $plugins * @param string $context */ function print_plugins_table($plugins, $context = '') { global $page; $checkbox = ! in_array( $context, array( 'mustuse', 'dropins' ) ) ? '' : ''; ?> '; } foreach ( (array)$plugins as $plugin_file => $plugin_data) { $actions = array(); if ( 'mustuse' == $context ) { $is_active = true; } elseif ( 'dropins' == $context ) { $dropins = _get_dropins(); $plugin_name = $plugin_file; if ( $plugin_file != $plugin_data['Name'] ) $plugin_name .= '
' . $plugin_data['Name']; if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant $is_active = true; $description = '

' . $dropins[ $plugin_file ][0] . '

'; } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true $is_active = true; $description = '

' . $dropins[ $plugin_file ][0] . '

'; } else { $is_active = false; $description = '' . $dropins[ $plugin_file ][0] . ' ' . __('Inactive:') . ' ' . sprintf( __( 'Requires %s in wp-config.php.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '

'; } $description .= '

' . $plugin_data['Description'] . '

'; } else { $is_active_for_network = is_plugin_active_for_network($plugin_file); $is_active = $is_active_for_network || is_plugin_active( $plugin_file ); if ( $is_active_for_network && !is_super_admin() ) continue; if ( $is_active ) { if ( $is_active_for_network ) { if ( is_super_admin() ) $actions[] = '' . __('Network Deactivate') . ''; } else { $actions[] = '' . __('Deactivate') . ''; } } else { if ( is_multisite() && is_network_only_plugin( $plugin_file ) ) $actions[] = '' . __('Network Only') . ''; else $actions[] = '' . __('Activate') . ''; if ( is_multisite() && is_super_admin() ) $actions[] = '' . __('Network Activate') . ''; if ( !is_multisite() && current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) ) $actions[] = '' . __('Edit') . ''; if ( ! $is_active && current_user_can('delete_plugins') ) $actions[] = '' . __('Delete') . ''; } } $actions = apply_filters( 'plugin_action_links', $actions, $plugin_file, $plugin_data, $context ); $actions = apply_filters( "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context ); $class = $is_active ? 'active' : 'inactive'; $checkbox = in_array( $context, array( 'mustuse', 'dropins' ) ) ? '' : ""; if ( 'dropins' != $context ) { $description = '

' . $plugin_data['Description'] . '

'; $plugin_name = $plugin_data['Name']; } echo " \n"; do_action( 'after_plugin_row', $plugin_file, $plugin_data, $context ); do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $context ); } ?>
' . __('No plugins to show') . '
$checkbox $plugin_name $description
"; echo '
'; foreach ( $actions as $action => $link ) { $sep = end($actions) == $link ? '' : ' | '; echo "$link$sep"; } echo "
"; $plugin_meta = array(); if ( !empty($plugin_data['Version']) ) $plugin_meta[] = sprintf(__('Version %s'), $plugin_data['Version']); if ( !empty($plugin_data['Author']) ) { $author = $plugin_data['Author']; if ( !empty($plugin_data['AuthorURI']) ) $author = '' . $plugin_data['Author'] . ''; $plugin_meta[] = sprintf( __('By %s'), $author ); } if ( ! empty($plugin_data['PluginURI']) ) $plugin_meta[] = '' . __('Visit plugin site') . ''; $plugin_meta = apply_filters('plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $context); echo implode(' | ', $plugin_meta); echo "

' . __( 'Files in the wp-content/mu-plugins directory are executed automatically.' ) . '

'; elseif ( 'dropins' == $status ) echo '

' . __( 'Drop-ins are advanced plugins in the wp-content directory that replace WordPress functionality when present.' ) . '

'; if ( !empty( $plugins ) && ( ! in_array( $status, array( 'mustuse', 'dropins' ) ) || $page_links ) ) : ?>
', $page_links_text, '
'; print_plugin_actions($status); ?>
$plugins_per_page ) $plugins = array_slice($plugins, $start, $plugins_per_page); print_plugins_table($plugins, $status); if ( !empty( $plugins ) && ! in_array( $status, array( 'mustuse', 'dropins' ) ) || $page_links ) { ?>
$page_links_text
"; print_plugin_actions($status, "action2"); ?>