wp/wp-admin/plugins.php
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
equal deleted inserted replaced
-1:000000000000 0:d970ebf37754
       
     1 <?php
       
     2 /**
       
     3  * Plugins administration panel.
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Administration
       
     7  */
       
     8 
       
     9 /** WordPress Administration Bootstrap */
       
    10 require_once( dirname( __FILE__ ) . '/admin.php' );
       
    11 
       
    12 if ( ! current_user_can('activate_plugins') )
       
    13 	wp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );
       
    14 
       
    15 $wp_list_table = _get_list_table('WP_Plugins_List_Table');
       
    16 $pagenum = $wp_list_table->get_pagenum();
       
    17 
       
    18 $action = $wp_list_table->current_action();
       
    19 
       
    20 $plugin = isset($_REQUEST['plugin']) ? $_REQUEST['plugin'] : '';
       
    21 $s = isset($_REQUEST['s']) ? urlencode($_REQUEST['s']) : '';
       
    22 
       
    23 // Clean up request URI from temporary args for screen options/paging uri's to work as expected.
       
    24 $_SERVER['REQUEST_URI'] = remove_query_arg(array('error', 'deleted', 'activate', 'activate-multi', 'deactivate', 'deactivate-multi', '_error_nonce'), $_SERVER['REQUEST_URI']);
       
    25 
       
    26 if ( $action ) {
       
    27 
       
    28 	switch ( $action ) {
       
    29 		case 'activate':
       
    30 			if ( ! current_user_can('activate_plugins') )
       
    31 				wp_die(__('You do not have sufficient permissions to activate plugins for this site.'));
       
    32 
       
    33 			if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {
       
    34 				wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
       
    35 				exit;
       
    36 			}
       
    37 
       
    38 			check_admin_referer('activate-plugin_' . $plugin);
       
    39 
       
    40 			$result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . $plugin), is_network_admin() );
       
    41 			if ( is_wp_error( $result ) ) {
       
    42 				if ( 'unexpected_output' == $result->get_error_code() ) {
       
    43 					$redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . $plugin . "&plugin_status=$status&paged=$page&s=$s");
       
    44 					wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
       
    45 					exit;
       
    46 				} else {
       
    47 					wp_die($result);
       
    48 				}
       
    49 			}
       
    50 
       
    51 			if ( ! is_network_admin() ) {
       
    52 				$recent = (array) get_option( 'recently_activated' );
       
    53 				unset( $recent[ $plugin ] );
       
    54 				update_option( 'recently_activated', $recent );
       
    55 			}
       
    56 
       
    57 			if ( isset($_GET['from']) && 'import' == $_GET['from'] ) {
       
    58 				wp_redirect( self_admin_url("import.php?import=" . str_replace('-importer', '', dirname($plugin))) ); // overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix
       
    59 			} else {
       
    60 				wp_redirect( self_admin_url("plugins.php?activate=true&plugin_status=$status&paged=$page&s=$s") ); // overrides the ?error=true one above
       
    61 			}
       
    62 			exit;
       
    63 			break;
       
    64 		case 'activate-selected':
       
    65 			if ( ! current_user_can('activate_plugins') )
       
    66 				wp_die(__('You do not have sufficient permissions to activate plugins for this site.'));
       
    67 
       
    68 			check_admin_referer('bulk-plugins');
       
    69 
       
    70 			$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
       
    71 
       
    72 			// Only activate plugins which are not already active.
       
    73 			if ( is_network_admin() ) {
       
    74 				foreach ( $plugins as $i => $plugin ) {
       
    75 					if ( is_plugin_active_for_network( $plugin ) )
       
    76 						unset( $plugins[ $i ] );
       
    77 				}
       
    78 			} else {
       
    79 				foreach ( $plugins as $i => $plugin ) {
       
    80 					if ( is_plugin_active( $plugin ) || is_network_only_plugin( $plugin ) )
       
    81 						unset( $plugins[ $i ] );
       
    82 				}
       
    83 			}
       
    84 
       
    85 			if ( empty($plugins) ) {
       
    86 				wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
       
    87 				exit;
       
    88 			}
       
    89 
       
    90 			activate_plugins($plugins, self_admin_url('plugins.php?error=true'), is_network_admin() );
       
    91 
       
    92 			if ( ! is_network_admin() ) {
       
    93 				$recent = (array) get_option('recently_activated' );
       
    94 				foreach ( $plugins as $plugin )
       
    95 					unset( $recent[ $plugin ] );
       
    96 				update_option( 'recently_activated', $recent );
       
    97 			}
       
    98 
       
    99 			wp_redirect( self_admin_url("plugins.php?activate-multi=true&plugin_status=$status&paged=$page&s=$s") );
       
   100 			exit;
       
   101 			break;
       
   102 		case 'update-selected' :
       
   103 
       
   104 			check_admin_referer( 'bulk-plugins' );
       
   105 
       
   106 			if ( isset( $_GET['plugins'] ) )
       
   107 				$plugins = explode( ',', $_GET['plugins'] );
       
   108 			elseif ( isset( $_POST['checked'] ) )
       
   109 				$plugins = (array) $_POST['checked'];
       
   110 			else
       
   111 				$plugins = array();
       
   112 
       
   113 			$title = __( 'Update Plugins' );
       
   114 			$parent_file = 'plugins.php';
       
   115 
       
   116 			require_once(ABSPATH . 'wp-admin/admin-header.php');
       
   117 
       
   118 			echo '<div class="wrap">';
       
   119 			screen_icon();
       
   120 			echo '<h2>' . esc_html( $title ) . '</h2>';
       
   121 
       
   122 			$url = self_admin_url('update.php?action=update-selected&amp;plugins=' . urlencode( join(',', $plugins) ));
       
   123 			$url = wp_nonce_url($url, 'bulk-update-plugins');
       
   124 
       
   125 			echo "<iframe src='$url' style='width: 100%; height:100%; min-height:850px;'></iframe>";
       
   126 			echo '</div>';
       
   127 			require_once(ABSPATH . 'wp-admin/admin-footer.php');
       
   128 			exit;
       
   129 			break;
       
   130 		case 'error_scrape':
       
   131 			if ( ! current_user_can('activate_plugins') )
       
   132 				wp_die(__('You do not have sufficient permissions to activate plugins for this site.'));
       
   133 
       
   134 			check_admin_referer('plugin-activation-error_' . $plugin);
       
   135 
       
   136 			$valid = validate_plugin($plugin);
       
   137 			if ( is_wp_error($valid) )
       
   138 				wp_die($valid);
       
   139 
       
   140 			if ( ! WP_DEBUG ) {
       
   141 				error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
       
   142 			}
       
   143 
       
   144 			@ini_set('display_errors', true); //Ensure that Fatal errors are displayed.
       
   145 			// Go back to "sandbox" scope so we get the same errors as before
       
   146 			function plugin_sandbox_scrape( $plugin ) {
       
   147 				include( WP_PLUGIN_DIR . '/' . $plugin );
       
   148 			}
       
   149 			plugin_sandbox_scrape( $plugin );
       
   150 			do_action('activate_' . $plugin);
       
   151 			exit;
       
   152 			break;
       
   153 		case 'deactivate':
       
   154 			if ( ! current_user_can('activate_plugins') )
       
   155 				wp_die(__('You do not have sufficient permissions to deactivate plugins for this site.'));
       
   156 
       
   157 			check_admin_referer('deactivate-plugin_' . $plugin);
       
   158 
       
   159 			if ( ! is_network_admin() && is_plugin_active_for_network( $plugin ) ) {
       
   160 				wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
       
   161 				exit;
       
   162 			}
       
   163 
       
   164 			deactivate_plugins( $plugin, false, is_network_admin() );
       
   165 			if ( ! is_network_admin() )
       
   166 				update_option( 'recently_activated', array( $plugin => time() ) + (array) get_option( 'recently_activated' ) );
       
   167 			if ( headers_sent() )
       
   168 				echo "<meta http-equiv='refresh' content='" . esc_attr( "0;url=plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) . "' />";
       
   169 			else
       
   170 				wp_redirect( self_admin_url("plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s") );
       
   171 			exit;
       
   172 			break;
       
   173 		case 'deactivate-selected':
       
   174 			if ( ! current_user_can('activate_plugins') )
       
   175 				wp_die(__('You do not have sufficient permissions to deactivate plugins for this site.'));
       
   176 
       
   177 			check_admin_referer('bulk-plugins');
       
   178 
       
   179 			$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
       
   180 			// Do not deactivate plugins which are already deactivated.
       
   181 			if ( is_network_admin() ) {
       
   182 				$plugins = array_filter( $plugins, 'is_plugin_active_for_network' );
       
   183 			} else {
       
   184 				$plugins = array_filter( $plugins, 'is_plugin_active' );
       
   185 				$plugins = array_diff( $plugins, array_filter( $plugins, 'is_plugin_active_for_network' ) );
       
   186 			}
       
   187 			if ( empty($plugins) ) {
       
   188 				wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
       
   189 				exit;
       
   190 			}
       
   191 
       
   192 			deactivate_plugins( $plugins, false, is_network_admin() );
       
   193 
       
   194 			if ( ! is_network_admin() ) {
       
   195 				$deactivated = array();
       
   196 				foreach ( $plugins as $plugin )
       
   197 					$deactivated[ $plugin ] = time();
       
   198 				update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ) );
       
   199 			}
       
   200 
       
   201 			wp_redirect( self_admin_url("plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page&s=$s") );
       
   202 			exit;
       
   203 			break;
       
   204 		case 'delete-selected':
       
   205 			if ( ! current_user_can('delete_plugins') )
       
   206 				wp_die(__('You do not have sufficient permissions to delete plugins for this site.'));
       
   207 
       
   208 			check_admin_referer('bulk-plugins');
       
   209 
       
   210 			//$_POST = from the plugin form; $_GET = from the FTP details screen.
       
   211 			$plugins = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array();
       
   212 			if ( empty( $plugins ) ) {
       
   213 				wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
       
   214 				exit;
       
   215 			}
       
   216 
       
   217 			$plugins = array_filter($plugins, 'is_plugin_inactive'); // Do not allow to delete Activated plugins.
       
   218 			if ( empty( $plugins ) ) {
       
   219 				wp_redirect( self_admin_url( "plugins.php?error=true&main=true&plugin_status=$status&paged=$page&s=$s" ) );
       
   220 				exit;
       
   221 			}
       
   222 
       
   223 			include(ABSPATH . 'wp-admin/update.php');
       
   224 
       
   225 			$parent_file = 'plugins.php';
       
   226 
       
   227 			if ( ! isset($_REQUEST['verify-delete']) ) {
       
   228 				wp_enqueue_script('jquery');
       
   229 				require_once(ABSPATH . 'wp-admin/admin-header.php');
       
   230 				?>
       
   231 			<div class="wrap">
       
   232 				<?php
       
   233 					$files_to_delete = $plugin_info = array();
       
   234 					$have_non_network_plugins = false;
       
   235 					foreach ( (array) $plugins as $plugin ) {
       
   236 						if ( '.' == dirname($plugin) ) {
       
   237 							$files_to_delete[] = WP_PLUGIN_DIR . '/' . $plugin;
       
   238 							if( $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin) ) {
       
   239 								$plugin_info[ $plugin ] = $data;
       
   240 								$plugin_info[ $plugin ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
       
   241 								if ( ! $plugin_info[ $plugin ]['Network'] )
       
   242 									$have_non_network_plugins = true;
       
   243 							}
       
   244 						} else {
       
   245 							// Locate all the files in that folder
       
   246 							$files = list_files( WP_PLUGIN_DIR . '/' . dirname($plugin) );
       
   247 							if ( $files ) {
       
   248 								$files_to_delete = array_merge($files_to_delete, $files);
       
   249 							}
       
   250 							// Get plugins list from that folder
       
   251 							if ( $folder_plugins = get_plugins( '/' . dirname($plugin)) ) {
       
   252 								foreach( $folder_plugins as $plugin_file => $data ) {
       
   253 									$plugin_info[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $data );
       
   254 									$plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
       
   255 									if ( ! $plugin_info[ $plugin_file ]['Network'] )
       
   256 										$have_non_network_plugins = true;
       
   257 								}
       
   258 							}
       
   259 						}
       
   260 					}
       
   261 					screen_icon();
       
   262 					$plugins_to_delete = count( $plugin_info );
       
   263 					echo '<h2>' . _n( 'Delete Plugin', 'Delete Plugins', $plugins_to_delete ) . '</h2>';
       
   264 				?>
       
   265 				<?php if ( $have_non_network_plugins && is_network_admin() ) : ?>
       
   266 				<div class="error"><p><strong><?php _e( 'Caution:' ); ?></strong> <?php echo _n( 'This plugin may be active on other sites in the network.', 'These plugins may be active on other sites in the network.', $plugins_to_delete ); ?></p></div>
       
   267 				<?php endif; ?>
       
   268 				<p><?php echo _n( 'You are about to remove the following plugin:', 'You are about to remove the following plugins:', $plugins_to_delete ); ?></p>
       
   269 					<ul class="ul-disc">
       
   270 						<?php
       
   271 						$data_to_delete = false;
       
   272 						foreach ( $plugin_info as $plugin ) {
       
   273 							if ( $plugin['is_uninstallable'] ) {
       
   274 								/* translators: 1: plugin name, 2: plugin author */
       
   275 								echo '<li>', sprintf( __( '<strong>%1$s</strong> by <em>%2$s</em> (will also <strong>delete its data</strong>)' ), esc_html($plugin['Name']), esc_html($plugin['AuthorName']) ), '</li>';
       
   276 								$data_to_delete = true;
       
   277 							} else {
       
   278 								/* translators: 1: plugin name, 2: plugin author */
       
   279 								echo '<li>', sprintf( __('<strong>%1$s</strong> by <em>%2$s</em>' ), esc_html($plugin['Name']), esc_html($plugin['AuthorName']) ), '</li>';
       
   280 							}
       
   281 						}
       
   282 						?>
       
   283 					</ul>
       
   284 				<p><?php
       
   285 				if ( $data_to_delete )
       
   286 					_e('Are you sure you wish to delete these files and data?');
       
   287 				else
       
   288 					_e('Are you sure you wish to delete these files?');
       
   289 				?></p>
       
   290 				<form method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>" style="display:inline;">
       
   291 					<input type="hidden" name="verify-delete" value="1" />
       
   292 					<input type="hidden" name="action" value="delete-selected" />
       
   293 					<?php
       
   294 						foreach ( (array) $plugins as $plugin )
       
   295 							echo '<input type="hidden" name="checked[]" value="' . esc_attr($plugin) . '" />';
       
   296 					?>
       
   297 					<?php wp_nonce_field('bulk-plugins') ?>
       
   298 					<?php submit_button( $data_to_delete ? __( 'Yes, Delete these files and data' ) : __( 'Yes, Delete these files' ), 'button', 'submit', false ); ?>
       
   299 				</form>
       
   300 				<form method="post" action="<?php echo esc_url(wp_get_referer()); ?>" style="display:inline;">
       
   301 					<?php submit_button( __( 'No, Return me to the plugin list' ), 'button', 'submit', false ); ?>
       
   302 				</form>
       
   303 
       
   304 				<p><a href="#" onclick="jQuery('#files-list').toggle(); return false;"><?php _e('Click to view entire list of files which will be deleted'); ?></a></p>
       
   305 				<div id="files-list" style="display:none;">
       
   306 					<ul class="code">
       
   307 					<?php
       
   308 						foreach ( (array)$files_to_delete as $file )
       
   309 							echo '<li>' . esc_html(str_replace(WP_PLUGIN_DIR, '', $file)) . '</li>';
       
   310 					?>
       
   311 					</ul>
       
   312 				</div>
       
   313 			</div>
       
   314 				<?php
       
   315 				require_once(ABSPATH . 'wp-admin/admin-footer.php');
       
   316 				exit;
       
   317 			} //Endif verify-delete
       
   318 			$delete_result = delete_plugins($plugins);
       
   319 
       
   320 			set_transient('plugins_delete_result_' . $user_ID, $delete_result); //Store the result in a cache rather than a URL param due to object type & length
       
   321 			wp_redirect( self_admin_url("plugins.php?deleted=true&plugin_status=$status&paged=$page&s=$s") );
       
   322 			exit;
       
   323 			break;
       
   324 		case 'clear-recent-list':
       
   325 			if ( ! is_network_admin() )
       
   326 				update_option( 'recently_activated', array() );
       
   327 			break;
       
   328 	}
       
   329 }
       
   330 
       
   331 $wp_list_table->prepare_items();
       
   332 
       
   333 wp_enqueue_script('plugin-install');
       
   334 add_thickbox();
       
   335 
       
   336 add_screen_option( 'per_page', array('label' => _x( 'Plugins', 'plugins per page (screen options)' ), 'default' => 999 ) );
       
   337 
       
   338 get_current_screen()->add_help_tab( array(
       
   339 'id'		=> 'overview',
       
   340 'title'		=> __('Overview'),
       
   341 'content'	=>
       
   342 	'<p>' . __('Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.') . '</p>' .
       
   343 	'<p>' . sprintf(__('You can find additional plugins for your site by using the <a href="%1$s">Plugin Browser/Installer</a> functionality or by browsing the <a href="%2$s" target="_blank">WordPress Plugin Directory</a> directly and installing new plugins manually. To manually install a plugin you generally just need to upload the plugin file into your <code>/wp-content/plugins</code> directory. Once a plugin has been installed, you can activate it here.'), 'plugin-install.php', 'http://wordpress.org/plugins/') . '</p>'
       
   344 ) );
       
   345 get_current_screen()->add_help_tab( array(
       
   346 'id'		=> 'compatibility-problems',
       
   347 'title'		=> __('Troubleshooting'),
       
   348 'content'	=>
       
   349 	'<p>' . __('Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin&#8217;s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue.') . '</p>' .
       
   350 	'<p>' . sprintf( __('If something goes wrong with a plugin and you can&#8217;t use WordPress, delete or rename that file in the <code>%s</code> directory and it will be automatically deactivated.'), WP_PLUGIN_DIR) . '</p>'
       
   351 ) );
       
   352 
       
   353 get_current_screen()->set_help_sidebar(
       
   354 	'<p><strong>' . __('For more information:') . '</strong></p>' .
       
   355 	'<p>' . __('<a href="http://codex.wordpress.org/Managing_Plugins#Plugin_Management" target="_blank">Documentation on Managing Plugins</a>') . '</p>' .
       
   356 	'<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
       
   357 );
       
   358 
       
   359 $title = __('Plugins');
       
   360 $parent_file = 'plugins.php';
       
   361 
       
   362 require_once(ABSPATH . 'wp-admin/admin-header.php');
       
   363 
       
   364 $invalid = validate_active_plugins();
       
   365 if ( !empty($invalid) )
       
   366 	foreach ( $invalid as $plugin_file => $error )
       
   367 		echo '<div id="message" class="error"><p>' . sprintf(__('The plugin <code>%s</code> has been <strong>deactivated</strong> due to an error: %s'), esc_html($plugin_file), $error->get_error_message()) . '</p></div>';
       
   368 ?>
       
   369 
       
   370 <?php if ( isset($_GET['error']) ) :
       
   371 
       
   372 	if ( isset( $_GET['main'] ) )
       
   373 		$errmsg = __( 'You cannot delete a plugin while it is active on the main site.' );
       
   374 	elseif ( isset($_GET['charsout']) )
       
   375 		$errmsg = sprintf(__('The plugin generated %d characters of <strong>unexpected output</strong> during activation. If you notice &#8220;headers already sent&#8221; messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.'), $_GET['charsout']);
       
   376 	else
       
   377 		$errmsg = __('Plugin could not be activated because it triggered a <strong>fatal error</strong>.');
       
   378 	?>
       
   379 	<div id="message" class="updated"><p><?php echo $errmsg; ?></p>
       
   380 	<?php
       
   381 		if ( !isset( $_GET['main'] ) && !isset($_GET['charsout']) && wp_verify_nonce($_GET['_error_nonce'], 'plugin-activation-error_' . $plugin) ) { ?>
       
   382 	<iframe style="border:0" width="100%" height="70px" src="<?php echo 'plugins.php?action=error_scrape&amp;plugin=' . esc_attr($plugin) . '&amp;_wpnonce=' . esc_attr($_GET['_error_nonce']); ?>"></iframe>
       
   383 	<?php
       
   384 		}
       
   385 	?>
       
   386 	</div>
       
   387 <?php elseif ( isset($_GET['deleted']) ) :
       
   388 		$delete_result = get_transient('plugins_delete_result_'.$user_ID);
       
   389 		delete_transient('plugins_delete_result'); //Delete it once we're done.
       
   390 
       
   391 		if ( is_wp_error($delete_result) ) : ?>
       
   392 		<div id="message" class="updated"><p><?php printf( __('Plugin could not be deleted due to an error: %s'), $delete_result->get_error_message() ); ?></p></div>
       
   393 		<?php else : ?>
       
   394 		<div id="message" class="updated"><p><?php _e('The selected plugins have been <strong>deleted</strong>.'); ?></p></div>
       
   395 		<?php endif; ?>
       
   396 <?php elseif ( isset($_GET['activate']) ) : ?>
       
   397 	<div id="message" class="updated"><p><?php _e('Plugin <strong>activated</strong>.') ?></p></div>
       
   398 <?php elseif (isset($_GET['activate-multi'])) : ?>
       
   399 	<div id="message" class="updated"><p><?php _e('Selected plugins <strong>activated</strong>.'); ?></p></div>
       
   400 <?php elseif ( isset($_GET['deactivate']) ) : ?>
       
   401 	<div id="message" class="updated"><p><?php _e('Plugin <strong>deactivated</strong>.') ?></p></div>
       
   402 <?php elseif (isset($_GET['deactivate-multi'])) : ?>
       
   403 	<div id="message" class="updated"><p><?php _e('Selected plugins <strong>deactivated</strong>.'); ?></p></div>
       
   404 <?php elseif ( 'update-selected' == $action ) : ?>
       
   405 	<div id="message" class="updated"><p><?php _e('No out of date plugins were selected.'); ?></p></div>
       
   406 <?php endif; ?>
       
   407 
       
   408 <div class="wrap">
       
   409 <?php screen_icon(); ?>
       
   410 <h2><?php echo esc_html( $title );
       
   411 if ( ( ! is_multisite() || is_network_admin() ) && current_user_can('install_plugins') ) { ?>
       
   412  <a href="<?php echo self_admin_url( 'plugin-install.php' ); ?>" class="add-new-h2"><?php echo esc_html_x('Add New', 'plugin'); ?></a>
       
   413 <?php }
       
   414 if ( $s )
       
   415 	printf( '<span class="subtitle">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $s ) ); ?>
       
   416 </h2>
       
   417 
       
   418 <?php do_action( 'pre_current_active_plugins', $plugins['all'] ) ?>
       
   419 
       
   420 <?php $wp_list_table->views(); ?>
       
   421 
       
   422 <form method="get" action="">
       
   423 <?php $wp_list_table->search_box( __( 'Search Installed Plugins' ), 'plugin' ); ?>
       
   424 </form>
       
   425 
       
   426 <form method="post" action="">
       
   427 
       
   428 <input type="hidden" name="plugin_status" value="<?php echo esc_attr($status) ?>" />
       
   429 <input type="hidden" name="paged" value="<?php echo esc_attr($page) ?>" />
       
   430 
       
   431 <?php $wp_list_table->display(); ?>
       
   432 </form>
       
   433 
       
   434 </div>
       
   435 
       
   436 <?php
       
   437 include(ABSPATH . 'wp-admin/admin-footer.php');