[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

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  __DIR__ . '/admin.php';
  11  
  12  if ( ! current_user_can( 'activate_plugins' ) ) {
  13      wp_die( __( 'Sorry, you are not allowed to manage plugins for this site.' ) );
  14  }
  15  
  16  $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
  17  $pagenum       = $wp_list_table->get_pagenum();
  18  
  19  $action = $wp_list_table->current_action();
  20  
  21  $plugin = isset( $_REQUEST['plugin'] ) ? wp_unslash( $_REQUEST['plugin'] ) : '';
  22  $s      = isset( $_REQUEST['s'] ) ? urlencode( wp_unslash( $_REQUEST['s'] ) ) : '';
  23  
  24  // Clean up request URI from temporary args for screen options/paging uri's to work as expected.
  25  $query_args_to_remove = array(
  26      'error',
  27      'deleted',
  28      'activate',
  29      'activate-multi',
  30      'deactivate',
  31      'deactivate-multi',
  32      'enabled-auto-update',
  33      'disabled-auto-update',
  34      'enabled-auto-update-multi',
  35      'disabled-auto-update-multi',
  36      '_error_nonce',
  37  );
  38  
  39  $_SERVER['REQUEST_URI'] = remove_query_arg( $query_args_to_remove, $_SERVER['REQUEST_URI'] );
  40  
  41  wp_enqueue_script( 'updates' );
  42  
  43  WP_Plugin_Dependencies::initialize();
  44  
  45  if ( $action ) {
  46  
  47      switch ( $action ) {
  48          case 'activate':
  49              if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
  50                  wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
  51              }
  52  
  53              if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {
  54                  wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
  55                  exit;
  56              }
  57  
  58              check_admin_referer( 'activate-plugin_' . $plugin );
  59  
  60              $result = activate_plugin( $plugin, self_admin_url( 'plugins.php?error=true&plugin=' . urlencode( $plugin ) ), is_network_admin() );
  61              if ( is_wp_error( $result ) ) {
  62                  if ( 'unexpected_output' === $result->get_error_code() ) {
  63                      $redirect = self_admin_url( 'plugins.php?error=true&charsout=' . strlen( $result->get_error_data() ) . '&plugin=' . urlencode( $plugin ) . "&plugin_status=$status&paged=$page&s=$s" );
  64                      wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) );
  65                      exit;
  66                  } else {
  67                      wp_die( $result );
  68                  }
  69              }
  70  
  71              if ( ! is_network_admin() ) {
  72                  $recent = (array) get_option( 'recently_activated' );
  73                  unset( $recent[ $plugin ] );
  74                  update_option( 'recently_activated', $recent, false );
  75              } else {
  76                  $recent = (array) get_site_option( 'recently_activated' );
  77                  unset( $recent[ $plugin ] );
  78                  update_site_option( 'recently_activated', $recent );
  79              }
  80  
  81              if ( isset( $_GET['from'] ) && 'import' === $_GET['from'] ) {
  82                  // Overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix.
  83                  wp_redirect( self_admin_url( 'import.php?import=' . str_replace( '-importer', '', dirname( $plugin ) ) ) );
  84              } elseif ( isset( $_GET['from'] ) && 'press-this' === $_GET['from'] ) {
  85                  wp_redirect( self_admin_url( 'press-this.php' ) );
  86              } else {
  87                  // Overrides the ?error=true one above.
  88                  wp_redirect( self_admin_url( "plugins.php?activate=true&plugin_status=$status&paged=$page&s=$s" ) );
  89              }
  90              exit;
  91  
  92          case 'activate-selected':
  93              if ( ! current_user_can( 'activate_plugins' ) ) {
  94                  wp_die( __( 'Sorry, you are not allowed to activate plugins for this site.' ) );
  95              }
  96  
  97              check_admin_referer( 'bulk-plugins' );
  98  
  99              $plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
 100  
 101              if ( is_network_admin() ) {
 102                  foreach ( $plugins as $i => $plugin ) {
 103                      // Only activate plugins which are not already network activated.
 104                      if ( is_plugin_active_for_network( $plugin ) ) {
 105                          unset( $plugins[ $i ] );
 106                      }
 107                  }
 108              } else {
 109                  foreach ( $plugins as $i => $plugin ) {
 110                      // Only activate plugins which are not already active and are not network-only when on Multisite.
 111                      if ( is_plugin_active( $plugin ) || ( is_multisite() && is_network_only_plugin( $plugin ) ) ) {
 112                          unset( $plugins[ $i ] );
 113                      }
 114                      // Only activate plugins which the user can activate.
 115                      if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
 116                          unset( $plugins[ $i ] );
 117                      }
 118                  }
 119              }
 120  
 121              if ( empty( $plugins ) ) {
 122                  wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
 123                  exit;
 124              }
 125  
 126              activate_plugins( $plugins, self_admin_url( 'plugins.php?error=true' ), is_network_admin() );
 127  
 128              if ( ! is_network_admin() ) {
 129                  $recent = (array) get_option( 'recently_activated' );
 130              } else {
 131                  $recent = (array) get_site_option( 'recently_activated' );
 132              }
 133  
 134              foreach ( $plugins as $plugin ) {
 135                  unset( $recent[ $plugin ] );
 136              }
 137  
 138              if ( ! is_network_admin() ) {
 139                  update_option( 'recently_activated', $recent, false );
 140              } else {
 141                  update_site_option( 'recently_activated', $recent );
 142              }
 143  
 144              wp_redirect( self_admin_url( "plugins.php?activate-multi=true&plugin_status=$status&paged=$page&s=$s" ) );
 145              exit;
 146  
 147          case 'update-selected':
 148              check_admin_referer( 'bulk-plugins' );
 149  
 150              if ( isset( $_GET['plugins'] ) ) {
 151                  $plugins = explode( ',', wp_unslash( $_GET['plugins'] ) );
 152              } elseif ( isset( $_POST['checked'] ) ) {
 153                  $plugins = (array) wp_unslash( $_POST['checked'] );
 154              } else {
 155                  $plugins = array();
 156              }
 157  
 158              // Used in the HTML title tag.
 159              $title       = __( 'Update Plugins' );
 160              $parent_file = 'plugins.php';
 161  
 162              wp_enqueue_script( 'updates' );
 163              require_once  ABSPATH . 'wp-admin/admin-header.php';
 164  
 165              echo '<div class="wrap">';
 166              echo '<h1>' . esc_html( $title ) . '</h1>';
 167  
 168              $url = self_admin_url( 'update.php?action=update-selected&amp;plugins=' . urlencode( implode( ',', $plugins ) ) );
 169              $url = wp_nonce_url( $url, 'bulk-update-plugins' );
 170  
 171              echo "<iframe src='$url' style='width: 100%; height:100%; min-height:850px;'></iframe>";
 172              echo '</div>';
 173              require_once  ABSPATH . 'wp-admin/admin-footer.php';
 174              exit;
 175  
 176          case 'error_scrape':
 177              if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
 178                  wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
 179              }
 180  
 181              check_admin_referer( 'plugin-activation-error_' . $plugin );
 182  
 183              $valid = validate_plugin( $plugin );
 184              if ( is_wp_error( $valid ) ) {
 185                  wp_die( $valid );
 186              }
 187  
 188              if ( ! WP_DEBUG ) {
 189                  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 );
 190              }
 191  
 192              ini_set( 'display_errors', true ); // Ensure that fatal errors are displayed.
 193              // Go back to "sandbox" scope so we get the same errors as before.
 194              plugin_sandbox_scrape( $plugin );
 195              /** This action is documented in wp-admin/includes/plugin.php */
 196              do_action( "activate_{$plugin}" );
 197              exit;
 198  
 199          case 'deactivate':
 200              if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
 201                  wp_die( __( 'Sorry, you are not allowed to deactivate this plugin.' ) );
 202              }
 203  
 204              check_admin_referer( 'deactivate-plugin_' . $plugin );
 205  
 206              if ( ! is_network_admin() && is_plugin_active_for_network( $plugin ) ) {
 207                  wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
 208                  exit;
 209              }
 210  
 211              deactivate_plugins( $plugin, false, is_network_admin() );
 212  
 213              if ( ! is_network_admin() ) {
 214                  update_option( 'recently_activated', array( $plugin => time() ) + (array) get_option( 'recently_activated' ), false );
 215              } else {
 216                  update_site_option( 'recently_activated', array( $plugin => time() ) + (array) get_site_option( 'recently_activated' ) );
 217              }
 218  
 219              if ( headers_sent() ) {
 220                  echo "<meta http-equiv='refresh' content='" . esc_attr( "0;url=plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) . "' />";
 221              } else {
 222                  wp_redirect( self_admin_url( "plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) );
 223              }
 224              exit;
 225  
 226          case 'deactivate-selected':
 227              if ( ! current_user_can( 'deactivate_plugins' ) ) {
 228                  wp_die( __( 'Sorry, you are not allowed to deactivate plugins for this site.' ) );
 229              }
 230  
 231              check_admin_referer( 'bulk-plugins' );
 232  
 233              $plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
 234              // Do not deactivate plugins which are already deactivated.
 235              if ( is_network_admin() ) {
 236                  $plugins = array_filter( $plugins, 'is_plugin_active_for_network' );
 237              } else {
 238                  $plugins = array_filter( $plugins, 'is_plugin_active' );
 239                  $plugins = array_diff( $plugins, array_filter( $plugins, 'is_plugin_active_for_network' ) );
 240  
 241                  foreach ( $plugins as $i => $plugin ) {
 242                      // Only deactivate plugins which the user can deactivate.
 243                      if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
 244                          unset( $plugins[ $i ] );
 245                      }
 246                  }
 247              }
 248              if ( empty( $plugins ) ) {
 249                  wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
 250                  exit;
 251              }
 252  
 253              deactivate_plugins( $plugins, false, is_network_admin() );
 254  
 255              $deactivated = array();
 256              foreach ( $plugins as $plugin ) {
 257                  $deactivated[ $plugin ] = time();
 258              }
 259  
 260              if ( ! is_network_admin() ) {
 261                  update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ), false );
 262              } else {
 263                  update_site_option( 'recently_activated', $deactivated + (array) get_site_option( 'recently_activated' ) );
 264              }
 265  
 266              wp_redirect( self_admin_url( "plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page&s=$s" ) );
 267              exit;
 268  
 269          case 'delete-selected':
 270              if ( ! current_user_can( 'delete_plugins' ) ) {
 271                  wp_die( __( 'Sorry, you are not allowed to delete plugins for this site.' ) );
 272              }
 273  
 274              check_admin_referer( 'bulk-plugins' );
 275  
 276              // $_POST = from the plugin form; $_GET = from the FTP details screen.
 277              $plugins = isset( $_REQUEST['checked'] ) ? (array) wp_unslash( $_REQUEST['checked'] ) : array();
 278              if ( empty( $plugins ) ) {
 279                  wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
 280                  exit;
 281              }
 282  
 283              $plugins = array_filter( $plugins, 'is_plugin_inactive' ); // Do not allow to delete activated plugins.
 284              if ( empty( $plugins ) ) {
 285                  wp_redirect( self_admin_url( "plugins.php?error=true&main=true&plugin_status=$status&paged=$page&s=$s" ) );
 286                  exit;
 287              }
 288  
 289              // Bail on all if any paths are invalid.
 290              // validate_file() returns truthy for invalid files.
 291              $invalid_plugin_files = array_filter( $plugins, 'validate_file' );
 292              if ( $invalid_plugin_files ) {
 293                  wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
 294                  exit;
 295              }
 296  
 297              require  ABSPATH . 'wp-admin/update.php';
 298  
 299              $parent_file = 'plugins.php';
 300  
 301              if ( ! isset( $_REQUEST['verify-delete'] ) ) {
 302                  wp_enqueue_script( 'jquery' );
 303                  require_once  ABSPATH . 'wp-admin/admin-header.php';
 304  
 305                  ?>
 306                  <div class="wrap">
 307                  <?php
 308  
 309                  $plugin_info              = array();
 310                  $have_non_network_plugins = false;
 311  
 312                  foreach ( (array) $plugins as $plugin ) {
 313                      $plugin_slug = dirname( $plugin );
 314  
 315                      if ( '.' === $plugin_slug ) {
 316                          $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
 317                          if ( $data ) {
 318                              $plugin_info[ $plugin ]                     = $data;
 319                              $plugin_info[ $plugin ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
 320                              if ( ! $plugin_info[ $plugin ]['Network'] ) {
 321                                  $have_non_network_plugins = true;
 322                              }
 323                          }
 324                      } else {
 325                          // Get plugins list from that folder.
 326                          $folder_plugins = get_plugins( '/' . $plugin_slug );
 327                          if ( $folder_plugins ) {
 328                              foreach ( $folder_plugins as $plugin_file => $data ) {
 329                                  $plugin_info[ $plugin_file ]                     = _get_plugin_data_markup_translate( $plugin_file, $data );
 330                                  $plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
 331                                  if ( ! $plugin_info[ $plugin_file ]['Network'] ) {
 332                                      $have_non_network_plugins = true;
 333                                  }
 334                              }
 335                          }
 336                      }
 337                  }
 338  
 339                  $plugins_to_delete = count( $plugin_info );
 340  
 341                  ?>
 342                  <?php if ( 1 === $plugins_to_delete ) : ?>
 343                      <h1><?php _e( 'Delete Plugin' ); ?></h1>
 344                      <?php
 345                      if ( $have_non_network_plugins && is_network_admin() ) :
 346                          $maybe_active_plugin = '<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'This plugin may be active on other sites in the network.' );
 347                          wp_admin_notice(
 348                              $maybe_active_plugin,
 349                              array(
 350                                  'additional_classes' => array( 'error' ),
 351                              )
 352                          );
 353                      endif;
 354                      ?>
 355                      <p><?php _e( 'You are about to remove the following plugin:' ); ?></p>
 356                  <?php else : ?>
 357                      <h1><?php _e( 'Delete Plugins' ); ?></h1>
 358                      <?php
 359                      if ( $have_non_network_plugins && is_network_admin() ) :
 360                          $maybe_active_plugins = '<strong>' . __( 'Caution:' ) . '</strong> ' . __( 'These plugins may be active on other sites in the network.' );
 361                          wp_admin_notice(
 362                              $maybe_active_plugins,
 363                              array(
 364                                  'additional_classes' => array( 'error' ),
 365                              )
 366                          );
 367                      endif;
 368                      ?>
 369                      <p><?php _e( 'You are about to remove the following plugins:' ); ?></p>
 370                  <?php endif; ?>
 371                      <ul class="ul-disc">
 372                          <?php
 373  
 374                          $data_to_delete = false;
 375  
 376                          foreach ( $plugin_info as $plugin ) {
 377                              if ( $plugin['is_uninstallable'] ) {
 378                                  /* translators: 1: Plugin name, 2: Plugin author. */
 379                                  echo '<li>', sprintf( __( '%1$s by %2$s (will also <strong>delete its data</strong>)' ), '<strong>' . $plugin['Name'] . '</strong>', '<em>' . $plugin['AuthorName'] . '</em>' ), '</li>';
 380                                  $data_to_delete = true;
 381                              } else {
 382                                  /* translators: 1: Plugin name, 2: Plugin author. */
 383                                  echo '<li>', sprintf( _x( '%1$s by %2$s', 'plugin' ), '<strong>' . $plugin['Name'] . '</strong>', '<em>' . $plugin['AuthorName'] ) . '</em>', '</li>';
 384                              }
 385                          }
 386  
 387                          ?>
 388                      </ul>
 389                  <p>
 390                  <?php
 391  
 392                  if ( $data_to_delete ) {
 393                      _e( 'Are you sure you want to delete these files and data?' );
 394                  } else {
 395                      _e( 'Are you sure you want to delete these files?' );
 396                  }
 397  
 398                  ?>
 399                  </p>
 400                  <form method="post" action="<?php echo esc_url( $_SERVER['REQUEST_URI'] ); ?>" style="display:inline;">
 401                      <input type="hidden" name="verify-delete" value="1" />
 402                      <input type="hidden" name="action" value="delete-selected" />
 403                      <?php
 404  
 405                      foreach ( (array) $plugins as $plugin ) {
 406                          echo '<input type="hidden" name="checked[]" value="' . esc_attr( $plugin ) . '" />';
 407                      }
 408  
 409                      ?>
 410                      <?php wp_nonce_field( 'bulk-plugins' ); ?>
 411                      <?php submit_button( $data_to_delete ? __( 'Yes, delete these files and data' ) : __( 'Yes, delete these files' ), '', 'submit', false ); ?>
 412                  </form>
 413                  <?php
 414  
 415                  $referer = wp_get_referer();
 416  
 417                  ?>
 418                  <form method="post" action="<?php echo $referer ? esc_url( $referer ) : ''; ?>" style="display:inline;">
 419                      <?php submit_button( __( 'No, return me to the plugin list' ), '', 'submit', false ); ?>
 420                  </form>
 421                  </div>
 422                  <?php
 423  
 424                  require_once  ABSPATH . 'wp-admin/admin-footer.php';
 425                  exit;
 426              } else {
 427                  $plugins_to_delete = count( $plugins );
 428              } // End if verify-delete.
 429  
 430              $delete_result = delete_plugins( $plugins );
 431  
 432              // Store the result in an option rather than a URL param due to object type & length.
 433              // Cannot use transient/cache, as that could get flushed if any plugin flushes data on uninstall/delete.
 434              update_option( 'plugins_delete_result_' . $user_ID, $delete_result, false );
 435              wp_redirect( self_admin_url( "plugins.php?deleted=$plugins_to_delete&plugin_status=$status&paged=$page&s=$s" ) );
 436              exit;
 437          case 'clear-recent-list':
 438              if ( ! is_network_admin() ) {
 439                  update_option( 'recently_activated', array(), false );
 440              } else {
 441                  update_site_option( 'recently_activated', array() );
 442              }
 443  
 444              break;
 445          case 'resume':
 446              if ( is_multisite() ) {
 447                  return;
 448              }
 449  
 450              if ( ! current_user_can( 'resume_plugin', $plugin ) ) {
 451                  wp_die( __( 'Sorry, you are not allowed to resume this plugin.' ) );
 452              }
 453  
 454              check_admin_referer( 'resume-plugin_' . $plugin );
 455  
 456              $result = resume_plugin( $plugin, self_admin_url( "plugins.php?error=resuming&plugin_status=$status&paged=$page&s=$s" ) );
 457  
 458              if ( is_wp_error( $result ) ) {
 459                  wp_die( $result );
 460              }
 461  
 462              wp_redirect( self_admin_url( "plugins.php?resume=true&plugin_status=$status&paged=$page&s=$s" ) );
 463              exit;
 464          case 'enable-auto-update':
 465          case 'disable-auto-update':
 466          case 'enable-auto-update-selected':
 467          case 'disable-auto-update-selected':
 468              if ( ! current_user_can( 'update_plugins' ) || ! wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
 469                  wp_die( __( 'Sorry, you are not allowed to manage plugins automatic updates.' ) );
 470              }
 471  
 472              if ( is_multisite() && ! is_network_admin() ) {
 473                  wp_die( __( 'Please connect to your network admin to manage plugins automatic updates.' ) );
 474              }
 475  
 476              $redirect = self_admin_url( "plugins.php?plugin_status={$status}&paged={$page}&s={$s}" );
 477  
 478              if ( 'enable-auto-update' === $action || 'disable-auto-update' === $action ) {
 479                  if ( empty( $plugin ) ) {
 480                      wp_redirect( $redirect );
 481                      exit;
 482                  }
 483  
 484                  check_admin_referer( 'updates' );
 485              } else {
 486                  if ( empty( $_POST['checked'] ) ) {
 487                      wp_redirect( $redirect );
 488                      exit;
 489                  }
 490  
 491                  check_admin_referer( 'bulk-plugins' );
 492              }
 493  
 494              $auto_updates = (array) get_site_option( 'auto_update_plugins', array() );
 495  
 496              if ( 'enable-auto-update' === $action ) {
 497                  $auto_updates[] = $plugin;
 498                  $auto_updates   = array_unique( $auto_updates );
 499                  $redirect       = add_query_arg( array( 'enabled-auto-update' => 'true' ), $redirect );
 500              } elseif ( 'disable-auto-update' === $action ) {
 501                  $auto_updates = array_diff( $auto_updates, array( $plugin ) );
 502                  $redirect     = add_query_arg( array( 'disabled-auto-update' => 'true' ), $redirect );
 503              } else {
 504                  $plugins = (array) wp_unslash( $_POST['checked'] );
 505  
 506                  if ( 'enable-auto-update-selected' === $action ) {
 507                      $new_auto_updates = array_merge( $auto_updates, $plugins );
 508                      $new_auto_updates = array_unique( $new_auto_updates );
 509                      $query_args       = array( 'enabled-auto-update-multi' => 'true' );
 510                  } else {
 511                      $new_auto_updates = array_diff( $auto_updates, $plugins );
 512                      $query_args       = array( 'disabled-auto-update-multi' => 'true' );
 513                  }
 514  
 515                  // Return early if all selected plugins already have auto-updates enabled or disabled.
 516                  // Must use non-strict comparison, so that array order is not treated as significant.
 517                  if ( $new_auto_updates == $auto_updates ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
 518                      wp_redirect( $redirect );
 519                      exit;
 520                  }
 521  
 522                  $auto_updates = $new_auto_updates;
 523                  $redirect     = add_query_arg( $query_args, $redirect );
 524              }
 525  
 526              /** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
 527              $all_items = apply_filters( 'all_plugins', get_plugins() );
 528  
 529              // Remove plugins that don't exist or have been deleted since the option was last updated.
 530              $auto_updates = array_intersect( $auto_updates, array_keys( $all_items ) );
 531  
 532              update_site_option( 'auto_update_plugins', $auto_updates );
 533  
 534              wp_redirect( $redirect );
 535              exit;
 536          default:
 537              if ( isset( $_POST['checked'] ) ) {
 538                  check_admin_referer( 'bulk-plugins' );
 539  
 540                  $screen   = get_current_screen()->id;
 541                  $sendback = wp_get_referer();
 542                  $plugins  = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
 543  
 544                  /** This action is documented in wp-admin/edit.php */
 545                  $sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $action, $plugins ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
 546                  wp_safe_redirect( $sendback );
 547                  exit;
 548              }
 549              break;
 550      }
 551  }
 552  
 553  $wp_list_table->prepare_items();
 554  
 555  wp_enqueue_script( 'plugin-install' );
 556  add_thickbox();
 557  
 558  add_screen_option( 'per_page', array( 'default' => 999 ) );
 559  
 560  get_current_screen()->add_help_tab(
 561      array(
 562          'id'      => 'overview',
 563          'title'   => __( 'Overview' ),
 564          'content' =>
 565                  '<p>' . __( 'Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.' ) . '</p>' .
 566                  '<p>' . __( 'The search for installed plugins will search for terms in their name, description, or author.' ) . ' <span id="live-search-desc" class="hide-if-no-js">' . __( 'The search results will be updated as you type.' ) . '</span></p>' .
 567                  '<p>' . sprintf(
 568                      /* translators: %s: WordPress Plugin Directory URL. */
 569                      __( 'If you would like to see more plugins to choose from, click on the &#8220;Add New Plugin&#8221; button and you will be able to browse or search for additional plugins from the <a href="%s">WordPress Plugin Directory</a>. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they are free!' ),
 570                      __( 'https://wordpress.org/plugins/' )
 571                  ) . '</p>',
 572      )
 573  );
 574  get_current_screen()->add_help_tab(
 575      array(
 576          'id'      => 'compatibility-problems',
 577          'title'   => __( 'Troubleshooting' ),
 578          'content' =>
 579                  '<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>' .
 580                  '<p>' . sprintf(
 581                      /* translators: %s: WP_PLUGIN_DIR constant value. */
 582                      __( 'If something goes wrong with a plugin and you cannot use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated.' ),
 583                      '<code>' . WP_PLUGIN_DIR . '</code>'
 584                  ) . '</p>',
 585      )
 586  );
 587  
 588  $help_sidebar_autoupdates = '';
 589  
 590  if ( current_user_can( 'update_plugins' ) && wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
 591      get_current_screen()->add_help_tab(
 592          array(
 593              'id'      => 'plugins-themes-auto-updates',
 594              'title'   => __( 'Auto-updates' ),
 595              'content' =>
 596                      '<p>' . __( 'Auto-updates can be enabled or disabled for each individual plugin. Plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system.' ) . '</p>' .
 597                      '<p>' . __( 'Auto-updates are only available for plugins recognized by WordPress.org, or that include a compatible update system.' ) . '</p>' .
 598                      '<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>',
 599          )
 600      );
 601  
 602      $help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
 603  }
 604  
 605  if ( current_user_can( 'install_plugins' ) ) {
 606      get_current_screen()->add_help_tab(
 607          array(
 608              'id'      => 'plugins-dependencies',
 609              'title'   => __( 'Dependencies' ),
 610              'content' =>
 611                  '<p>' . __( 'Plugin Dependencies aims to make the process of installing and activating add-ons (dependents) and the plugins they rely on (dependencies) consistent and easy.' ) . '</p>' .
 612                  '<p>' . __( 'If a required plugin is deleted, a notice will be displayed on the Plugin administration screen informing the user that there is some missing dependencies to install and/or activate. Additionally, each plugin whose dependencies are not met will have an error notice on their plugin row.' ) . '</p>' .
 613                  '<p>' . __( 'If a dependent plugin is missing some dependencies, its activation button will be disabled until the required dependencies are activated.' ) . '</p>',
 614          )
 615      );
 616  }
 617  
 618  get_current_screen()->set_help_sidebar(
 619      '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
 620      '<p>' . __( '<a href="https://wordpress.org/documentation/article/manage-plugins/">Documentation on Managing Plugins</a>' ) . '</p>' .
 621      $help_sidebar_autoupdates .
 622      '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
 623  );
 624  
 625  get_current_screen()->set_screen_reader_content(
 626      array(
 627          'heading_views'      => __( 'Filter plugins list' ),
 628          'heading_pagination' => __( 'Plugins list navigation' ),
 629          'heading_list'       => __( 'Plugins list' ),
 630      )
 631  );
 632  
 633  // Used in the HTML title tag.
 634  $title       = __( 'Plugins' );
 635  $parent_file = 'plugins.php';
 636  
 637  require_once  ABSPATH . 'wp-admin/admin-header.php';
 638  
 639  $invalid = validate_active_plugins();
 640  if ( ! empty( $invalid ) ) {
 641      foreach ( $invalid as $plugin_file => $error ) {
 642          $deactivated_message = sprintf(
 643              /* translators: 1: Plugin file, 2: Error message. */
 644              __( 'The plugin %1$s has been deactivated due to an error: %2$s' ),
 645              '<code>' . esc_html( $plugin_file ) . '</code>',
 646              esc_html( $error->get_error_message() )
 647          );
 648          wp_admin_notice(
 649              $deactivated_message,
 650              array(
 651                  'id'                 => 'message',
 652                  'additional_classes' => array( 'error' ),
 653              )
 654          );
 655      }
 656  }
 657  
 658  // Used by wp_admin_notice() updated notices.
 659  $updated_notice_args = array(
 660      'id'                 => 'message',
 661      'additional_classes' => array( 'updated' ),
 662      'dismissible'        => true,
 663  );
 664  if ( isset( $_GET['error'] ) ) {
 665  
 666      if ( isset( $_GET['main'] ) ) {
 667          $errmsg = __( 'You cannot delete a plugin while it is active on the main site.' );
 668      } elseif ( isset( $_GET['charsout'] ) ) {
 669          $errmsg = sprintf(
 670              /* translators: %d: Number of characters. */
 671              _n(
 672                  'The plugin generated %d character of <strong>unexpected output</strong> during activation.',
 673                  'The plugin generated %d characters of <strong>unexpected output</strong> during activation.',
 674                  $_GET['charsout']
 675              ),
 676              $_GET['charsout']
 677          );
 678          $errmsg .= ' ' . __( 'If you notice &#8220;headers already sent&#8221; messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.' );
 679      } elseif ( 'resuming' === $_GET['error'] ) {
 680          $errmsg = __( 'Plugin could not be resumed because it triggered a <strong>fatal error</strong>.' );
 681      } else {
 682          $errmsg = __( 'Plugin could not be activated because it triggered a <strong>fatal error</strong>.' );
 683      }
 684  
 685      if ( ! isset( $_GET['main'] ) && ! isset( $_GET['charsout'] )
 686          && isset( $_GET['_error_nonce'] ) && wp_verify_nonce( $_GET['_error_nonce'], 'plugin-activation-error_' . $plugin )
 687      ) {
 688          $iframe_url = add_query_arg(
 689              array(
 690                  'action'   => 'error_scrape',
 691                  'plugin'   => urlencode( $plugin ),
 692                  '_wpnonce' => urlencode( $_GET['_error_nonce'] ),
 693              ),
 694              admin_url( 'plugins.php' )
 695          );
 696  
 697          $errmsg .= '<iframe style="border:0" width="100%" height="70px" src="' . esc_url( $iframe_url ) . '"></iframe>';
 698      }
 699  
 700      wp_admin_notice(
 701          $errmsg,
 702          array(
 703              'id'                 => 'message',
 704              'additional_classes' => array( 'error' ),
 705          )
 706      );
 707  
 708  } elseif ( isset( $_GET['deleted'] ) ) {
 709      $delete_result = get_option( 'plugins_delete_result_' . $user_ID );
 710      // Delete it once we're done.
 711      delete_option( 'plugins_delete_result_' . $user_ID );
 712  
 713      if ( is_wp_error( $delete_result ) ) {
 714          $plugin_not_deleted_message = sprintf(
 715              /* translators: %s: Error message. */
 716              __( 'Plugin could not be deleted due to an error: %s' ),
 717              esc_html( $delete_result->get_error_message() )
 718          );
 719          wp_admin_notice(
 720              $plugin_not_deleted_message,
 721              array(
 722                  'id'                 => 'message',
 723                  'additional_classes' => array( 'error' ),
 724                  'dismissible'        => true,
 725              )
 726          );
 727      } else {
 728          if ( 1 === (int) $_GET['deleted'] ) {
 729              $plugins_deleted_message = __( 'The selected plugin has been deleted.' );
 730          } else {
 731              $plugins_deleted_message = __( 'The selected plugins have been deleted.' );
 732          }
 733          wp_admin_notice( $plugins_deleted_message, $updated_notice_args );
 734      }
 735  } elseif ( isset( $_GET['activate'] ) ) {
 736      wp_admin_notice( __( 'Plugin activated.' ), $updated_notice_args );
 737  } elseif ( isset( $_GET['activate-multi'] ) ) {
 738      wp_admin_notice( __( 'Selected plugins activated.' ), $updated_notice_args );
 739  } elseif ( isset( $_GET['deactivate'] ) ) {
 740      wp_admin_notice( __( 'Plugin deactivated.' ), $updated_notice_args );
 741  } elseif ( isset( $_GET['deactivate-multi'] ) ) {
 742      wp_admin_notice( __( 'Selected plugins deactivated.' ), $updated_notice_args );
 743  } elseif ( 'update-selected' === $action ) {
 744      wp_admin_notice( __( 'All selected plugins are up to date.' ), $updated_notice_args );
 745  } elseif ( isset( $_GET['resume'] ) ) {
 746      wp_admin_notice( __( 'Plugin resumed.' ), $updated_notice_args );
 747  } elseif ( isset( $_GET['enabled-auto-update'] ) ) {
 748      wp_admin_notice( __( 'Plugin will be auto-updated.' ), $updated_notice_args );
 749  } elseif ( isset( $_GET['disabled-auto-update'] ) ) {
 750      wp_admin_notice( __( 'Plugin will no longer be auto-updated.' ), $updated_notice_args );
 751  } elseif ( isset( $_GET['enabled-auto-update-multi'] ) ) {
 752      wp_admin_notice( __( 'Selected plugins will be auto-updated.' ), $updated_notice_args );
 753  } elseif ( isset( $_GET['disabled-auto-update-multi'] ) ) {
 754      wp_admin_notice( __( 'Selected plugins will no longer be auto-updated.' ), $updated_notice_args );
 755  }
 756  ?>
 757  
 758  <?php WP_Plugin_Dependencies::display_admin_notice_for_unmet_dependencies(); ?>
 759  <?php WP_Plugin_Dependencies::display_admin_notice_for_circular_dependencies(); ?>
 760  <div class="wrap">
 761  <h1 class="wp-heading-inline">
 762  <?php
 763  echo esc_html( $title );
 764  ?>
 765  </h1>
 766  
 767  <?php
 768  if ( ( ! is_multisite() || is_network_admin() ) && current_user_can( 'install_plugins' ) ) {
 769      ?>
 770      <a href="<?php echo esc_url( self_admin_url( 'plugin-install.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Plugin' ); ?></a>
 771      <?php
 772  }
 773  
 774  if ( strlen( $s ) ) {
 775      echo '<span class="subtitle">';
 776      printf(
 777          /* translators: %s: Search query. */
 778          __( 'Search results for: %s' ),
 779          '<strong>' . esc_html( urldecode( $s ) ) . '</strong>'
 780      );
 781      echo '</span>';
 782  }
 783  ?>
 784  
 785  <hr class="wp-header-end">
 786  
 787  <?php
 788  /**
 789   * Fires before the plugins list table is rendered.
 790   *
 791   * This hook also fires before the plugins list table is rendered in the Network Admin.
 792   *
 793   * Please note: The 'active' portion of the hook name does not refer to whether the current
 794   * view is for active plugins, but rather all plugins actively-installed.
 795   *
 796   * @since 3.0.0
 797   *
 798   * @param array[] $plugins_all An array of arrays containing information on all installed plugins.
 799   */
 800  do_action( 'pre_current_active_plugins', $plugins['all'] );
 801  ?>
 802  
 803  <?php $wp_list_table->views(); ?>
 804  
 805  <form class="search-form search-plugins" method="get">
 806  <?php $wp_list_table->search_box( __( 'Search installed plugins' ), 'plugin' ); ?>
 807  </form>
 808  
 809  <form method="post" id="bulk-action-form">
 810  
 811  <input type="hidden" name="plugin_status" value="<?php echo esc_attr( $status ); ?>" />
 812  <input type="hidden" name="paged" value="<?php echo esc_attr( $page ); ?>" />
 813  
 814  <?php $wp_list_table->display(); ?>
 815  </form>
 816  
 817      <span class="spinner"></span>
 818  </div>
 819  
 820  <?php
 821  wp_print_request_filesystem_credentials_modal();
 822  wp_print_admin_notice_templates();
 823  wp_print_update_row_templates();
 824  
 825  require_once  ABSPATH . 'wp-admin/admin-footer.php';


Generated : Thu Nov 21 08:20:01 2024 Cross-referenced by PHPXref