[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-admin/ -> plugins.php (source)

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


Generated: Fri May 25 03:56:23 2012 Hosted by follow the white rabbit.