[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-admin/ -> update-core.php (source)

   1  <?php
   2  /**
   3   * Update Core administration panel.
   4   *
   5   * @package WordPress
   6   * @subpackage Administration
   7   */
   8  
   9  /** WordPress Administration Bootstrap */
  10  require_once  __DIR__ . '/admin.php';
  11  
  12  wp_enqueue_style( 'plugin-install' );
  13  wp_enqueue_script( 'plugin-install' );
  14  wp_enqueue_script( 'updates' );
  15  add_thickbox();
  16  
  17  if ( is_multisite() && ! is_network_admin() ) {
  18      wp_redirect( network_admin_url( 'update-core.php' ) );
  19      exit;
  20  }
  21  
  22  if ( ! current_user_can( 'update_core' ) && ! current_user_can( 'update_themes' ) && ! current_user_can( 'update_plugins' ) && ! current_user_can( 'update_languages' ) ) {
  23      wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
  24  }
  25  
  26  /**
  27   * Lists available core updates.
  28   *
  29   * @since 2.7.0
  30   *
  31   * @global string $wp_local_package Locale code of the package.
  32   * @global wpdb   $wpdb             WordPress database abstraction object.
  33   *
  34   * @param object $update
  35   */
  36  function list_core_update( $update ) {
  37      global $wp_local_package, $wpdb;
  38      static $first_pass = true;
  39  
  40      $wp_version     = wp_get_wp_version();
  41      $version_string = sprintf( '%s&ndash;%s', $update->current, get_locale() );
  42  
  43      if ( 'en_US' === $update->locale && 'en_US' === get_locale() ) {
  44          $version_string = $update->current;
  45      } elseif ( 'en_US' === $update->locale && $update->packages->partial && $wp_version === $update->partial_version ) {
  46          $updates = get_core_updates();
  47          if ( $updates && 1 === count( $updates ) ) {
  48              // If the only available update is a partial builds, it doesn't need a language-specific version string.
  49              $version_string = $update->current;
  50          }
  51      } elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() ) {
  52          $version_string = sprintf( '%s&ndash;%s', $update->current, $update->locale );
  53      }
  54  
  55      $current = false;
  56      if ( ! isset( $update->response ) || 'latest' === $update->response ) {
  57          $current = true;
  58      }
  59  
  60      $message       = '';
  61      $form_action   = 'update-core.php?action=do-core-upgrade';
  62      $php_version   = PHP_VERSION;
  63      $mysql_version = $wpdb->db_version();
  64      $show_buttons  = true;
  65  
  66      // Nightly build versions have two hyphens and a commit number.
  67      if ( preg_match( '/-\w+-\d+/', $update->current ) ) {
  68          // Retrieve the major version number.
  69          preg_match( '/^\d+.\d+/', $update->current, $update_major );
  70          /* translators: %s: WordPress version. */
  71          $submit = sprintf( __( 'Update to latest %s nightly' ), $update_major[0] );
  72      } else {
  73          /* translators: %s: WordPress version. */
  74          $submit = sprintf( __( 'Update to version %s' ), $version_string );
  75      }
  76  
  77      if ( 'development' === $update->response ) {
  78          $message = __( 'You can update to the latest nightly build manually:' );
  79      } else {
  80          if ( $current ) {
  81              /* translators: %s: WordPress version. */
  82              $submit      = sprintf( __( 'Re-install version %s' ), $version_string );
  83              $form_action = 'update-core.php?action=do-core-reinstall';
  84          } else {
  85              $php_compat = version_compare( $php_version, $update->php_version, '>=' );
  86              if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) {
  87                  $mysql_compat = true;
  88              } else {
  89                  $mysql_compat = version_compare( $mysql_version, $update->mysql_version, '>=' );
  90              }
  91  
  92              $version_url = sprintf(
  93                  /* translators: %s: WordPress version. */
  94                  esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
  95                  sanitize_title( $update->current )
  96              );
  97  
  98              $php_update_message = '</p><p>' . sprintf(
  99                  /* translators: %s: URL to Update PHP page. */
 100                  __( '<a href="%s">Learn more about updating PHP</a>.' ),
 101                  esc_url( wp_get_update_php_url() )
 102              );
 103  
 104              $annotation = wp_get_update_php_annotation();
 105  
 106              if ( $annotation ) {
 107                  $php_update_message .= '</p><p><em>' . $annotation . '</em>';
 108              }
 109  
 110              if ( ! $mysql_compat && ! $php_compat ) {
 111                  $message = sprintf(
 112                      /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */
 113                      __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ),
 114                      $version_url,
 115                      $update->current,
 116                      $update->php_version,
 117                      $update->mysql_version,
 118                      $php_version,
 119                      $mysql_version
 120                  ) . $php_update_message;
 121              } elseif ( ! $php_compat ) {
 122                  $message = sprintf(
 123                      /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */
 124                      __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires PHP version %3$s or higher. You are running version %4$s.' ),
 125                      $version_url,
 126                      $update->current,
 127                      $update->php_version,
 128                      $php_version
 129                  ) . $php_update_message;
 130              } elseif ( ! $mysql_compat ) {
 131                  $message = sprintf(
 132                      /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */
 133                      __( 'You cannot update because <a href="%1$s">WordPress %2$s</a> requires MySQL version %3$s or higher. You are running version %4$s.' ),
 134                      $version_url,
 135                      $update->current,
 136                      $update->mysql_version,
 137                      $mysql_version
 138                  );
 139              } else {
 140                  $message = sprintf(
 141                      /* translators: 1: Installed WordPress version number, 2: URL to WordPress release notes, 3: New WordPress version number, including locale if necessary. */
 142                      __( 'You can update from WordPress %1$s to <a href="%2$s">WordPress %3$s</a> manually:' ),
 143                      $wp_version,
 144                      $version_url,
 145                      $version_string
 146                  );
 147              }
 148  
 149              if ( ! $mysql_compat || ! $php_compat ) {
 150                  $show_buttons = false;
 151              }
 152          }
 153      }
 154  
 155      echo '<p>';
 156      echo $message;
 157      echo '</p>';
 158  
 159      echo '<form method="post" action="' . esc_url( $form_action ) . '" name="upgrade" class="upgrade">';
 160      wp_nonce_field( 'upgrade-core' );
 161  
 162      echo '<p>';
 163      echo '<input name="version" value="' . esc_attr( $update->current ) . '" type="hidden" />';
 164      echo '<input name="locale" value="' . esc_attr( $update->locale ) . '" type="hidden" />';
 165      if ( $show_buttons ) {
 166          if ( $first_pass ) {
 167              submit_button( $submit, $current ? '' : 'primary regular', 'upgrade', false );
 168              $first_pass = false;
 169          } else {
 170              submit_button( $submit, '', 'upgrade', false );
 171          }
 172      }
 173      if ( 'en_US' !== $update->locale ) {
 174          if ( ! isset( $update->dismissed ) || ! $update->dismissed ) {
 175              submit_button( __( 'Hide this update' ), '', 'dismiss', false );
 176          } else {
 177              submit_button( __( 'Bring back this update' ), '', 'undismiss', false );
 178          }
 179      }
 180      echo '</p>';
 181  
 182      if ( 'en_US' !== $update->locale && ( ! isset( $wp_local_package ) || $wp_local_package !== $update->locale ) ) {
 183          echo '<p class="hint">' . __( 'This localized version contains both the translation and various other localization fixes.' ) . '</p>';
 184      } elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() && ( ! $update->packages->partial && $wp_version === $update->partial_version ) ) {
 185          // Partial builds don't need language-specific warnings.
 186          echo '<p class="hint">' . sprintf(
 187              /* translators: %s: WordPress version. */
 188              __( 'You are about to install WordPress %s <strong>in English (US)</strong>. There is a chance this update will break your translation. You may prefer to wait for the localized version to be released.' ),
 189              'development' !== $update->response ? $update->current : ''
 190          ) . '</p>';
 191      }
 192  
 193      echo '</form>';
 194  }
 195  
 196  /**
 197   * Display dismissed updates.
 198   *
 199   * @since 2.7.0
 200   */
 201  function dismissed_updates() {
 202      $dismissed = get_core_updates(
 203          array(
 204              'dismissed' => true,
 205              'available' => false,
 206          )
 207      );
 208  
 209      if ( $dismissed ) {
 210          $show_text = esc_js( __( 'Show hidden updates' ) );
 211          $hide_text = esc_js( __( 'Hide hidden updates' ) );
 212          ?>
 213          <script type="text/javascript">
 214              jQuery( function( $ ) {
 215                  $( '#show-dismissed' ).on( 'click', function() {
 216                      var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) );
 217  
 218                      if ( isExpanded ) {
 219                          $( this ).text( '<?php echo $show_text; ?>' ).attr( 'aria-expanded', 'false' );
 220                      } else {
 221                          $( this ).text( '<?php echo $hide_text; ?>' ).attr( 'aria-expanded', 'true' );
 222                      }
 223  
 224                      $( '#dismissed-updates' ).toggle( 'fast' );
 225                  });
 226              });
 227          </script>
 228          <?php
 229          echo '<p class="hide-if-no-js"><button type="button" class="button" id="show-dismissed" aria-expanded="false">' . __( 'Show hidden updates' ) . '</button></p>';
 230          echo '<ul id="dismissed-updates" class="core-updates dismissed">';
 231          foreach ( (array) $dismissed as $update ) {
 232              echo '<li>';
 233              list_core_update( $update );
 234              echo '</li>';
 235          }
 236          echo '</ul>';
 237      }
 238  }
 239  
 240  /**
 241   * Display upgrade WordPress for downloading latest or upgrading automatically form.
 242   *
 243   * @since 2.7.0
 244   */
 245  function core_upgrade_preamble() {
 246      $updates = get_core_updates();
 247  
 248      // Include an unmodified $wp_version.
 249      require  ABSPATH . WPINC . '/version.php';
 250  
 251      $is_development_version = preg_match( '/alpha|beta|RC/', $wp_version );
 252  
 253      if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) {
 254          echo '<h2 class="response">';
 255          _e( 'An updated version of WordPress is available.' );
 256          echo '</h2>';
 257  
 258          $message = sprintf(
 259              /* translators: 1: Documentation on WordPress backups, 2: Documentation on updating WordPress. */
 260              __( '<strong>Important:</strong> Before updating, please <a href="%1$s">back up your database and files</a>. For help with updates, visit the <a href="%2$s">Updating WordPress</a> documentation page.' ),
 261              __( 'https://developer.wordpress.org/advanced-administration/security/backup/' ),
 262              __( 'https://wordpress.org/documentation/article/updating-wordpress/' )
 263          );
 264          wp_admin_notice(
 265              $message,
 266              array(
 267                  'type'               => 'warning',
 268                  'additional_classes' => array( 'inline' ),
 269              )
 270          );
 271      } elseif ( $is_development_version ) {
 272          echo '<h2 class="response">' . __( 'You are using a development version of WordPress.' ) . '</h2>';
 273      } else {
 274          echo '<h2 class="response">' . __( 'You have the latest version of WordPress.' ) . '</h2>';
 275      }
 276  
 277      echo '<ul class="core-updates">';
 278      foreach ( (array) $updates as $update ) {
 279          echo '<li>';
 280          list_core_update( $update );
 281          echo '</li>';
 282      }
 283      echo '</ul>';
 284  
 285      // Don't show the maintenance mode notice when we are only showing a single re-install option.
 286      if ( $updates && ( count( $updates ) > 1 || 'latest' !== $updates[0]->response ) ) {
 287          echo '<p>' . __( 'While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, this mode will be deactivated.' ) . '</p>';
 288      } elseif ( ! $updates ) {
 289          list( $normalized_version ) = explode( '-', $wp_version );
 290          echo '<p>' . sprintf(
 291              /* translators: 1: URL to About screen, 2: WordPress version. */
 292              __( '<a href="%1$s">Learn more about WordPress %2$s</a>.' ),
 293              esc_url( self_admin_url( 'about.php' ) ),
 294              $normalized_version
 295          ) . '</p>';
 296      }
 297  
 298      dismissed_updates();
 299  }
 300  
 301  /**
 302   * Display WordPress auto-updates settings.
 303   *
 304   * @since 5.6.0
 305   */
 306  function core_auto_updates_settings() {
 307      if ( isset( $_GET['core-major-auto-updates-saved'] ) ) {
 308          if ( 'enabled' === $_GET['core-major-auto-updates-saved'] ) {
 309              $notice_text = __( 'Automatic updates for all WordPress versions have been enabled. Thank you!' );
 310              wp_admin_notice(
 311                  $notice_text,
 312                  array(
 313                      'type'        => 'success',
 314                      'dismissible' => true,
 315                  )
 316              );
 317          } elseif ( 'disabled' === $_GET['core-major-auto-updates-saved'] ) {
 318              $notice_text = __( 'WordPress will only receive automatic security and maintenance releases from now on.' );
 319              wp_admin_notice(
 320                  $notice_text,
 321                  array(
 322                      'type'        => 'success',
 323                      'dismissible' => true,
 324                  )
 325              );
 326          }
 327      }
 328  
 329      require_once  ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
 330      $updater = new WP_Automatic_Updater();
 331  
 332      // Defaults:
 333      $upgrade_dev   = get_site_option( 'auto_update_core_dev', 'enabled' ) === 'enabled';
 334      $upgrade_minor = get_site_option( 'auto_update_core_minor', 'enabled' ) === 'enabled';
 335      $upgrade_major = get_site_option( 'auto_update_core_major', 'unset' ) === 'enabled';
 336  
 337      $can_set_update_option = true;
 338      // WP_AUTO_UPDATE_CORE = true (all), 'beta', 'rc', 'development', 'branch-development', 'minor', false.
 339      if ( defined( 'WP_AUTO_UPDATE_CORE' ) ) {
 340          if ( false === WP_AUTO_UPDATE_CORE ) {
 341              // Defaults to turned off, unless a filter allows it.
 342              $upgrade_dev   = false;
 343              $upgrade_minor = false;
 344              $upgrade_major = false;
 345          } elseif ( true === WP_AUTO_UPDATE_CORE
 346              || in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true )
 347          ) {
 348              // ALL updates for core.
 349              $upgrade_dev   = true;
 350              $upgrade_minor = true;
 351              $upgrade_major = true;
 352          } elseif ( 'minor' === WP_AUTO_UPDATE_CORE ) {
 353              // Only minor updates for core.
 354              $upgrade_dev   = false;
 355              $upgrade_minor = true;
 356              $upgrade_major = false;
 357          }
 358  
 359          // The UI is overridden by the `WP_AUTO_UPDATE_CORE` constant.
 360          $can_set_update_option = false;
 361      }
 362  
 363      if ( $updater->is_disabled() ) {
 364          $upgrade_dev   = false;
 365          $upgrade_minor = false;
 366          $upgrade_major = false;
 367  
 368          /*
 369           * The UI is overridden by the `AUTOMATIC_UPDATER_DISABLED` constant
 370           * or the `automatic_updater_disabled` filter,
 371           * or by `wp_is_file_mod_allowed( 'automatic_updater' )`.
 372           * See `WP_Automatic_Updater::is_disabled()`.
 373           */
 374          $can_set_update_option = false;
 375      }
 376  
 377      // Is the UI overridden by a plugin using the `allow_major_auto_core_updates` filter?
 378      if ( has_filter( 'allow_major_auto_core_updates' ) ) {
 379          $can_set_update_option = false;
 380      }
 381  
 382      /** This filter is documented in wp-admin/includes/class-core-upgrader.php */
 383      $upgrade_dev = apply_filters( 'allow_dev_auto_core_updates', $upgrade_dev );
 384      /** This filter is documented in wp-admin/includes/class-core-upgrader.php */
 385      $upgrade_minor = apply_filters( 'allow_minor_auto_core_updates', $upgrade_minor );
 386      /** This filter is documented in wp-admin/includes/class-core-upgrader.php */
 387      $upgrade_major = apply_filters( 'allow_major_auto_core_updates', $upgrade_major );
 388  
 389      $auto_update_settings = array(
 390          'dev'   => $upgrade_dev,
 391          'minor' => $upgrade_minor,
 392          'major' => $upgrade_major,
 393      );
 394  
 395      if ( $upgrade_major ) {
 396          $wp_version = wp_get_wp_version();
 397          $updates    = get_core_updates();
 398  
 399          if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) {
 400              echo '<p>' . wp_get_auto_update_message() . '</p>';
 401          }
 402      }
 403  
 404      $action_url = self_admin_url( 'update-core.php?action=core-major-auto-updates-settings' );
 405      ?>
 406  
 407      <p class="auto-update-status">
 408          <?php
 409  
 410          if ( $updater->is_vcs_checkout( ABSPATH ) ) {
 411              _e( 'This site appears to be under version control. Automatic updates are disabled.' );
 412          } elseif ( $upgrade_major ) {
 413              _e( 'This site is automatically kept up to date with each new version of WordPress.' );
 414  
 415              if ( $can_set_update_option ) {
 416                  echo '<br />';
 417                  printf(
 418                      '<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-disable">%s</a>',
 419                      wp_nonce_url( add_query_arg( 'value', 'disable', $action_url ), 'core-major-auto-updates-nonce' ),
 420                      __( 'Switch to automatic updates for maintenance and security releases only.' )
 421                  );
 422              }
 423          } elseif ( $upgrade_minor ) {
 424              _e( 'This site is automatically kept up to date with maintenance and security releases of WordPress only.' );
 425  
 426              if ( $can_set_update_option ) {
 427                  echo '<br />';
 428                  printf(
 429                      '<a href="%s" class="core-auto-update-settings-link core-auto-update-settings-link-enable">%s</a>',
 430                      wp_nonce_url( add_query_arg( 'value', 'enable', $action_url ), 'core-major-auto-updates-nonce' ),
 431                      __( 'Enable automatic updates for all new versions of WordPress.' )
 432                  );
 433              }
 434          } else {
 435              _e( 'This site will not receive automatic updates for new versions of WordPress.' );
 436          }
 437          ?>
 438      </p>
 439  
 440      <?php
 441      /**
 442       * Fires after the major core auto-update settings.
 443       *
 444       * @since 5.6.0
 445       *
 446       * @param array $auto_update_settings {
 447       *     Array of core auto-update settings.
 448       *
 449       *     @type bool $dev   Whether to enable automatic updates for development versions.
 450       *     @type bool $minor Whether to enable minor automatic core updates.
 451       *     @type bool $major Whether to enable major automatic core updates.
 452       * }
 453       */
 454      do_action( 'after_core_auto_updates_settings', $auto_update_settings );
 455  }
 456  
 457  /**
 458   * Display the upgrade plugins form.
 459   *
 460   * @since 2.9.0
 461   */
 462  function list_plugin_updates() {
 463      $wp_version     = wp_get_wp_version();
 464      $cur_wp_version = preg_replace( '/-.*$/', '', $wp_version );
 465  
 466      require_once  ABSPATH . 'wp-admin/includes/plugin-install.php';
 467      $plugins = get_plugin_updates();
 468      if ( empty( $plugins ) ) {
 469          echo '<h2>' . __( 'Plugins' ) . '</h2>';
 470          echo '<p>' . __( 'Your plugins are all up to date.' ) . '</p>';
 471          return;
 472      }
 473      $form_action = 'update-core.php?action=do-plugin-upgrade';
 474  
 475      $core_updates = get_core_updates();
 476      if ( ! isset( $core_updates[0]->response ) || 'latest' === $core_updates[0]->response || 'development' === $core_updates[0]->response || version_compare( $core_updates[0]->current, $cur_wp_version, '=' ) ) {
 477          $core_update_version = false;
 478      } else {
 479          $core_update_version = $core_updates[0]->current;
 480      }
 481  
 482      $plugins_count = count( $plugins );
 483      ?>
 484  <h2>
 485      <?php
 486      printf(
 487          '%s <span class="count">(%d)</span>',
 488          __( 'Plugins' ),
 489          number_format_i18n( $plugins_count )
 490      );
 491      ?>
 492  </h2>
 493  <p><?php _e( 'The following plugins have new versions available. Check the ones you want to update and then click &#8220;Update Plugins&#8221;.' ); ?></p>
 494  <form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-plugins" class="upgrade">
 495      <?php wp_nonce_field( 'upgrade-core' ); ?>
 496  <p><input id="upgrade-plugins" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p>
 497  <table class="widefat updates-table" id="update-plugins-table">
 498      <thead>
 499      <tr>
 500          <td class="manage-column check-column"><input type="checkbox" id="plugins-select-all" /></td>
 501          <td class="manage-column"><label for="plugins-select-all"><?php _e( 'Select All' ); ?></label></td>
 502      </tr>
 503      </thead>
 504  
 505      <tbody class="plugins">
 506      <?php
 507  
 508      $auto_updates = array();
 509      if ( wp_is_auto_update_enabled_for_type( 'plugin' ) ) {
 510          $auto_updates       = (array) get_site_option( 'auto_update_plugins', array() );
 511          $auto_update_notice = ' | ' . wp_get_auto_update_message();
 512      }
 513  
 514      foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
 515          $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
 516  
 517          $icon            = '<span class="dashicons dashicons-admin-plugins"></span>';
 518          $preferred_icons = array( 'svg', '2x', '1x', 'default' );
 519          foreach ( $preferred_icons as $preferred_icon ) {
 520              if ( ! empty( $plugin_data->update->icons[ $preferred_icon ] ) ) {
 521                  $icon = '<img src="' . esc_url( $plugin_data->update->icons[ $preferred_icon ] ) . '" alt="" />';
 522                  break;
 523              }
 524          }
 525  
 526          // Get plugin compat for running version of WordPress.
 527          if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $cur_wp_version, '>=' ) ) {
 528              /* translators: %s: WordPress version. */
 529              $compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $cur_wp_version );
 530          } else {
 531              /* translators: %s: WordPress version. */
 532              $compat = '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $cur_wp_version );
 533          }
 534          // Get plugin compat for updated version of WordPress.
 535          if ( $core_update_version ) {
 536              if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $core_update_version, '>=' ) ) {
 537                  /* translators: %s: WordPress version. */
 538                  $compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $core_update_version );
 539              } else {
 540                  /* translators: %s: WordPress version. */
 541                  $compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $core_update_version );
 542              }
 543          }
 544  
 545          $requires_php   = isset( $plugin_data->update->requires_php ) ? $plugin_data->update->requires_php : null;
 546          $compatible_php = is_php_version_compatible( $requires_php );
 547  
 548          if ( ! $compatible_php && current_user_can( 'update_php' ) ) {
 549              $compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . '&nbsp;';
 550              $compat .= sprintf(
 551                  /* translators: %s: URL to Update PHP page. */
 552                  __( '<a href="%s">Learn more about updating PHP</a>.' ),
 553                  esc_url( wp_get_update_php_url() )
 554              );
 555  
 556              $annotation = wp_get_update_php_annotation();
 557  
 558              if ( $annotation ) {
 559                  $compat .= '</p><p><em>' . $annotation . '</em>';
 560              }
 561          }
 562  
 563          // Get the upgrade notice for the new plugin version.
 564          if ( isset( $plugin_data->update->upgrade_notice ) ) {
 565              $upgrade_notice = '<br />' . strip_tags( $plugin_data->update->upgrade_notice );
 566          } else {
 567              $upgrade_notice = '';
 568          }
 569  
 570          $details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data->update->slug . '&section=changelog&TB_iframe=true&width=640&height=662' );
 571          $details     = sprintf(
 572              '<a href="%1$s" class="thickbox open-plugin-details-modal" aria-label="%2$s">%3$s</a>',
 573              esc_url( $details_url ),
 574              /* translators: 1: Plugin name, 2: Version number. */
 575              esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_data->Name, $plugin_data->update->new_version ) ),
 576              /* translators: %s: Plugin version. */
 577              sprintf( __( 'View version %s details.' ), $plugin_data->update->new_version )
 578          );
 579  
 580          $checkbox_id = 'checkbox_' . md5( $plugin_file );
 581          ?>
 582      <tr>
 583          <td class="check-column">
 584              <?php if ( $compatible_php ) : ?>
 585                  <input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $plugin_file ); ?>" />
 586                  <label for="<?php echo $checkbox_id; ?>">
 587                      <span class="screen-reader-text">
 588                      <?php
 589                      /* translators: Hidden accessibility text. %s: Plugin name. */
 590                      printf( __( 'Select %s' ), $plugin_data->Name );
 591                      ?>
 592                      </span>
 593                  </label>
 594              <?php endif; ?>
 595          </td>
 596          <td class="plugin-title"><p>
 597              <?php echo $icon; ?>
 598              <strong><?php echo $plugin_data->Name; ?></strong>
 599              <?php
 600              printf(
 601                  /* translators: 1: Plugin version, 2: New version. */
 602                  __( 'You have version %1$s installed. Update to %2$s.' ),
 603                  $plugin_data->Version,
 604                  $plugin_data->update->new_version
 605              );
 606  
 607              echo ' ' . $details . $compat;
 608  
 609              if ( in_array( $plugin_file, $auto_updates, true ) ) {
 610                  echo $auto_update_notice;
 611              }
 612  
 613              echo $upgrade_notice;
 614              ?>
 615          </p></td>
 616      </tr>
 617              <?php
 618      }
 619      ?>
 620      </tbody>
 621  
 622      <tfoot>
 623      <tr>
 624          <td class="manage-column check-column"><input type="checkbox" id="plugins-select-all-2" /></td>
 625          <td class="manage-column"><label for="plugins-select-all-2"><?php _e( 'Select All' ); ?></label></td>
 626      </tr>
 627      </tfoot>
 628  </table>
 629  <p><input id="upgrade-plugins-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Plugins' ); ?>" name="upgrade" /></p>
 630  </form>
 631      <?php
 632  }
 633  
 634  /**
 635   * Display the upgrade themes form.
 636   *
 637   * @since 2.9.0
 638   */
 639  function list_theme_updates() {
 640      $themes = get_theme_updates();
 641      if ( empty( $themes ) ) {
 642          echo '<h2>' . __( 'Themes' ) . '</h2>';
 643          echo '<p>' . __( 'Your themes are all up to date.' ) . '</p>';
 644          return;
 645      }
 646  
 647      $form_action = 'update-core.php?action=do-theme-upgrade';
 648  
 649      $themes_count = count( $themes );
 650      ?>
 651  <h2>
 652      <?php
 653      printf(
 654          '%s <span class="count">(%d)</span>',
 655          __( 'Themes' ),
 656          number_format_i18n( $themes_count )
 657      );
 658      ?>
 659  </h2>
 660  <p><?php _e( 'The following themes have new versions available. Check the ones you want to update and then click &#8220;Update Themes&#8221;.' ); ?></p>
 661  <p>
 662      <?php
 663      printf(
 664          /* translators: %s: Link to documentation on child themes. */
 665          __( '<strong>Please Note:</strong> Any customizations you have made to theme files will be lost. Please consider using <a href="%s">child themes</a> for modifications.' ),
 666          __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' )
 667      );
 668      ?>
 669  </p>
 670  <form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-themes" class="upgrade">
 671      <?php wp_nonce_field( 'upgrade-core' ); ?>
 672  <p><input id="upgrade-themes" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p>
 673  <table class="widefat updates-table" id="update-themes-table">
 674      <thead>
 675      <tr>
 676          <td class="manage-column check-column"><input type="checkbox" id="themes-select-all" /></td>
 677          <td class="manage-column"><label for="themes-select-all"><?php _e( 'Select All' ); ?></label></td>
 678      </tr>
 679      </thead>
 680  
 681      <tbody class="plugins">
 682      <?php
 683      $auto_updates = array();
 684      if ( wp_is_auto_update_enabled_for_type( 'theme' ) ) {
 685          $auto_updates       = (array) get_site_option( 'auto_update_themes', array() );
 686          $auto_update_notice = ' | ' . wp_get_auto_update_message();
 687      }
 688  
 689      foreach ( $themes as $stylesheet => $theme ) {
 690          $requires_wp  = isset( $theme->update['requires'] ) ? $theme->update['requires'] : null;
 691          $requires_php = isset( $theme->update['requires_php'] ) ? $theme->update['requires_php'] : null;
 692  
 693          $compatible_wp  = is_wp_version_compatible( $requires_wp );
 694          $compatible_php = is_php_version_compatible( $requires_php );
 695  
 696          $compat = '';
 697  
 698          if ( ! $compatible_wp && ! $compatible_php ) {
 699              $compat .= '<br />' . __( 'This update does not work with your versions of WordPress and PHP.' ) . '&nbsp;';
 700              if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
 701                  $compat .= sprintf(
 702                      /* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
 703                      __( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP</a>.' ),
 704                      esc_url( self_admin_url( 'update-core.php' ) ),
 705                      esc_url( wp_get_update_php_url() )
 706                  );
 707  
 708                  $annotation = wp_get_update_php_annotation();
 709  
 710                  if ( $annotation ) {
 711                      $compat .= '</p><p><em>' . $annotation . '</em>';
 712                  }
 713              } elseif ( current_user_can( 'update_core' ) ) {
 714                  $compat .= sprintf(
 715                      /* translators: %s: URL to WordPress Updates screen. */
 716                      __( '<a href="%s">Please update WordPress</a>.' ),
 717                      esc_url( self_admin_url( 'update-core.php' ) )
 718                  );
 719              } elseif ( current_user_can( 'update_php' ) ) {
 720                  $compat .= sprintf(
 721                      /* translators: %s: URL to Update PHP page. */
 722                      __( '<a href="%s">Learn more about updating PHP</a>.' ),
 723                      esc_url( wp_get_update_php_url() )
 724                  );
 725  
 726                  $annotation = wp_get_update_php_annotation();
 727  
 728                  if ( $annotation ) {
 729                      $compat .= '</p><p><em>' . $annotation . '</em>';
 730                  }
 731              }
 732          } elseif ( ! $compatible_wp ) {
 733              $compat .= '<br />' . __( 'This update does not work with your version of WordPress.' ) . '&nbsp;';
 734              if ( current_user_can( 'update_core' ) ) {
 735                  $compat .= sprintf(
 736                      /* translators: %s: URL to WordPress Updates screen. */
 737                      __( '<a href="%s">Please update WordPress</a>.' ),
 738                      esc_url( self_admin_url( 'update-core.php' ) )
 739                  );
 740              }
 741          } elseif ( ! $compatible_php ) {
 742              $compat .= '<br />' . __( 'This update does not work with your version of PHP.' ) . '&nbsp;';
 743              if ( current_user_can( 'update_php' ) ) {
 744                  $compat .= sprintf(
 745                      /* translators: %s: URL to Update PHP page. */
 746                      __( '<a href="%s">Learn more about updating PHP</a>.' ),
 747                      esc_url( wp_get_update_php_url() )
 748                  );
 749  
 750                  $annotation = wp_get_update_php_annotation();
 751  
 752                  if ( $annotation ) {
 753                      $compat .= '</p><p><em>' . $annotation . '</em>';
 754                  }
 755              }
 756          }
 757  
 758          $checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
 759          ?>
 760      <tr>
 761          <td class="check-column">
 762              <?php if ( $compatible_wp && $compatible_php ) : ?>
 763                  <input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" />
 764                  <label for="<?php echo $checkbox_id; ?>">
 765                      <span class="screen-reader-text">
 766                      <?php
 767                      /* translators: Hidden accessibility text. %s: Theme name. */
 768                      printf( __( 'Select %s' ), $theme->display( 'Name' ) );
 769                      ?>
 770                      </span>
 771                  </label>
 772              <?php endif; ?>
 773          </td>
 774          <td class="plugin-title"><p>
 775              <img src="<?php echo esc_url( $theme->get_screenshot() . '?ver=' . $theme->version ); ?>" width="85" height="64" class="updates-table-screenshot" alt="" />
 776              <strong><?php echo $theme->display( 'Name' ); ?></strong>
 777              <?php
 778              printf(
 779                  /* translators: 1: Theme version, 2: New version. */
 780                  __( 'You have version %1$s installed. Update to %2$s.' ),
 781                  $theme->display( 'Version' ),
 782                  $theme->update['new_version']
 783              );
 784  
 785              echo ' ' . $compat;
 786  
 787              if ( in_array( $stylesheet, $auto_updates, true ) ) {
 788                  echo $auto_update_notice;
 789              }
 790              ?>
 791          </p></td>
 792      </tr>
 793              <?php
 794      }
 795      ?>
 796      </tbody>
 797  
 798      <tfoot>
 799      <tr>
 800          <td class="manage-column check-column"><input type="checkbox" id="themes-select-all-2" /></td>
 801          <td class="manage-column"><label for="themes-select-all-2"><?php _e( 'Select All' ); ?></label></td>
 802      </tr>
 803      </tfoot>
 804  </table>
 805  <p><input id="upgrade-themes-2" class="button" type="submit" value="<?php esc_attr_e( 'Update Themes' ); ?>" name="upgrade" /></p>
 806  </form>
 807      <?php
 808  }
 809  
 810  /**
 811   * Display the update translations form.
 812   *
 813   * @since 3.7.0
 814   */
 815  function list_translation_updates() {
 816      $updates = wp_get_translation_updates();
 817      if ( ! $updates ) {
 818          if ( 'en_US' !== get_locale() ) {
 819              echo '<h2>' . __( 'Translations' ) . '</h2>';
 820              echo '<p>' . __( 'Your translations are all up to date.' ) . '</p>';
 821          }
 822          return;
 823      }
 824  
 825      $form_action = 'update-core.php?action=do-translation-upgrade';
 826      ?>
 827      <h2><?php _e( 'Translations' ); ?></h2>
 828      <form method="post" action="<?php echo esc_url( $form_action ); ?>" name="upgrade-translations" class="upgrade">
 829          <p><?php _e( 'New translations are available.' ); ?></p>
 830          <?php wp_nonce_field( 'upgrade-translations' ); ?>
 831          <p><input class="button" type="submit" value="<?php esc_attr_e( 'Update Translations' ); ?>" name="upgrade" /></p>
 832      </form>
 833      <?php
 834  }
 835  
 836  /**
 837   * Upgrades WordPress core display.
 838   *
 839   * @since 2.7.0
 840   *
 841   * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 842   *
 843   * @param bool $reinstall
 844   */
 845  function do_core_upgrade( $reinstall = false ) {
 846      global $wp_filesystem;
 847  
 848      require_once  ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
 849  
 850      if ( $reinstall ) {
 851          $url = 'update-core.php?action=do-core-reinstall';
 852      } else {
 853          $url = 'update-core.php?action=do-core-upgrade';
 854      }
 855      $url = wp_nonce_url( $url, 'upgrade-core' );
 856  
 857      $version = isset( $_POST['version'] ) ? $_POST['version'] : false;
 858      $locale  = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
 859      $update  = find_core_update( $version, $locale );
 860      if ( ! $update ) {
 861          return;
 862      }
 863  
 864      /*
 865       * Allow relaxed file ownership writes for User-initiated upgrades when the API specifies
 866       * that it's safe to do so. This only happens when there are no new files to create.
 867       */
 868      $allow_relaxed_file_ownership = ! $reinstall && isset( $update->new_files ) && ! $update->new_files;
 869  
 870      ?>
 871      <div class="wrap">
 872      <h1><?php _e( 'Update WordPress' ); ?></h1>
 873      <?php
 874  
 875      $credentials = request_filesystem_credentials( $url, '', false, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership );
 876      if ( false === $credentials ) {
 877          echo '</div>';
 878          return;
 879      }
 880  
 881      if ( ! WP_Filesystem( $credentials, ABSPATH, $allow_relaxed_file_ownership ) ) {
 882          // Failed to connect. Error and request again.
 883          request_filesystem_credentials( $url, '', true, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership );
 884          echo '</div>';
 885          return;
 886      }
 887  
 888      if ( $wp_filesystem->errors->has_errors() ) {
 889          foreach ( $wp_filesystem->errors->get_error_messages() as $message ) {
 890              show_message( $message );
 891          }
 892          echo '</div>';
 893          return;
 894      }
 895  
 896      if ( $reinstall ) {
 897          $update->response = 'reinstall';
 898      }
 899  
 900      add_filter( 'update_feedback', 'show_message' );
 901  
 902      $upgrader = new Core_Upgrader();
 903      $result   = $upgrader->upgrade(
 904          $update,
 905          array(
 906              'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership,
 907          )
 908      );
 909  
 910      if ( is_wp_error( $result ) ) {
 911          show_message( $result );
 912          if ( 'up_to_date' !== $result->get_error_code() && 'locked' !== $result->get_error_code() ) {
 913              show_message( __( 'Installation failed.' ) );
 914          }
 915          echo '</div>';
 916          return;
 917      }
 918  
 919      show_message( __( 'WordPress updated successfully.' ) );
 920      show_message(
 921          '<span class="hide-if-no-js">' . sprintf(
 922              /* translators: 1: WordPress version, 2: URL to About screen. */
 923              __( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href="%2$s">here</a>.' ),
 924              $result,
 925              esc_url( self_admin_url( 'about.php?updated' ) )
 926          ) . '</span>'
 927      );
 928      show_message(
 929          '<span class="hide-if-js">' . sprintf(
 930              /* translators: 1: WordPress version, 2: URL to About screen. */
 931              __( 'Welcome to WordPress %1$s. <a href="%2$s">Learn more</a>.' ),
 932              $result,
 933              esc_url( self_admin_url( 'about.php?updated' ) )
 934          ) . '</span>'
 935      );
 936      ?>
 937      </div>
 938      <script type="text/javascript">
 939      window.location = '<?php echo esc_url( self_admin_url( 'about.php?updated' ) ); ?>';
 940      </script>
 941      <?php
 942  }
 943  
 944  /**
 945   * Dismiss a core update.
 946   *
 947   * @since 2.7.0
 948   */
 949  function do_dismiss_core_update() {
 950      $version = isset( $_POST['version'] ) ? $_POST['version'] : false;
 951      $locale  = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
 952      $update  = find_core_update( $version, $locale );
 953      if ( ! $update ) {
 954          return;
 955      }
 956      dismiss_core_update( $update );
 957      wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) );
 958      exit;
 959  }
 960  
 961  /**
 962   * Undismiss a core update.
 963   *
 964   * @since 2.7.0
 965   */
 966  function do_undismiss_core_update() {
 967      $version = isset( $_POST['version'] ) ? $_POST['version'] : false;
 968      $locale  = isset( $_POST['locale'] ) ? $_POST['locale'] : 'en_US';
 969      $update  = find_core_update( $version, $locale );
 970      if ( ! $update ) {
 971          return;
 972      }
 973      undismiss_core_update( $version, $locale );
 974      wp_redirect( wp_nonce_url( 'update-core.php?action=upgrade-core', 'upgrade-core' ) );
 975      exit;
 976  }
 977  
 978  $action = isset( $_GET['action'] ) ? $_GET['action'] : 'upgrade-core';
 979  
 980  $upgrade_error = false;
 981  if ( ( 'do-theme-upgrade' === $action || ( 'do-plugin-upgrade' === $action && ! isset( $_GET['plugins'] ) ) )
 982      && ! isset( $_POST['checked'] ) ) {
 983      $upgrade_error = ( 'do-theme-upgrade' === $action ) ? 'themes' : 'plugins';
 984      $action        = 'upgrade-core';
 985  }
 986  
 987  $title       = __( 'WordPress Updates' );
 988  $parent_file = 'index.php';
 989  
 990  $updates_overview  = '<p>' . __( 'On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories.' ) . '</p>';
 991  $updates_overview .= '<p>' . __( 'If an update is available, you&#8127;ll see a notification appear in the Toolbar and navigation menu.' ) . ' ' . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' ) . '</p>';
 992  
 993  get_current_screen()->add_help_tab(
 994      array(
 995          'id'      => 'overview',
 996          'title'   => __( 'Overview' ),
 997          'content' => $updates_overview,
 998      )
 999  );
1000  
1001  $updates_howto  = '<p>' . __( '<strong>WordPress</strong> &mdash; Updating your WordPress installation is a simple one-click procedure: just <strong>click on the &#8220;Update now&#8221; button</strong> when you are notified that a new version is available.' ) . ' ' . __( 'In most cases, WordPress will automatically apply maintenance and security updates in the background for you.' ) . '</p>';
1002  $updates_howto .= '<p>' . __( '<strong>Themes and Plugins</strong> &mdash; To update individual themes or plugins from this screen, use the checkboxes to make your selection, then <strong>click on the appropriate &#8220;Update&#8221; button</strong>. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button.' ) . '</p>';
1003  
1004  if ( 'en_US' !== get_locale() ) {
1005      $updates_howto .= '<p>' . __( '<strong>Translations</strong> &mdash; The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can <strong>click the &#8220;Update Translations&#8221;</strong> button.' ) . '</p>';
1006  }
1007  
1008  get_current_screen()->add_help_tab(
1009      array(
1010          'id'      => 'how-to-update',
1011          'title'   => __( 'How to Update' ),
1012          'content' => $updates_howto,
1013      )
1014  );
1015  
1016  $help_sidebar_autoupdates = '';
1017  
1018  if ( ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type( 'theme' ) ) || ( current_user_can( 'update_plugins' ) && wp_is_auto_update_enabled_for_type( 'plugin' ) ) ) {
1019      $help_tab_autoupdates  = '<p>' . __( 'Auto-updates can be enabled or disabled for WordPress major versions and for each individual theme or plugin. Themes or 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>';
1020      $help_tab_autoupdates .= '<p>' . __( 'Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling.' ) . '</p>';
1021  
1022      get_current_screen()->add_help_tab(
1023          array(
1024              'id'      => 'plugins-themes-auto-updates',
1025              'title'   => __( 'Auto-updates' ),
1026              'content' => $help_tab_autoupdates,
1027          )
1028      );
1029  
1030      $help_sidebar_autoupdates = '<p>' . __( '<a href="https://wordpress.org/documentation/article/plugins-themes-auto-updates/">Documentation on Auto-updates</a>' ) . '</p>';
1031  }
1032  
1033  $help_sidebar_rollback = '';
1034  
1035  if ( current_user_can( 'update_themes' ) || current_user_can( 'update_plugins' ) ) {
1036      $rollback_help = '<p>' . __( 'This feature will create a temporary backup of a plugin or theme before it is upgraded. This backup is used to restore the plugin or theme back to its previous state if there is an error during the update process.' ) . '</p>';
1037  
1038      $rollback_help .= '<p>' . __( 'On systems with fewer resources, this may lead to server timeouts or resource limits being reached. If you encounter an issue during the update process, please create a support forum topic and reference <strong>Rollback</strong> in the issue title.' ) . '</p>';
1039  
1040      get_current_screen()->add_help_tab(
1041          array(
1042              'id'      => 'rollback-plugins-themes',
1043              'title'   => __( 'Restore Plugin or Theme' ),
1044              'content' => $rollback_help,
1045          )
1046      );
1047  
1048      $help_sidebar_rollback = '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/wordpress/common-errors/">Common Errors</a>' ) . '</p>';
1049  }
1050  
1051  get_current_screen()->set_help_sidebar(
1052      '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
1053      '<p>' . __( '<a href="https://wordpress.org/documentation/article/dashboard-updates-screen/">Documentation on Updating WordPress</a>' ) . '</p>' .
1054      $help_sidebar_autoupdates .
1055      '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>' .
1056      $help_sidebar_rollback
1057  );
1058  
1059  if ( 'upgrade-core' === $action ) {
1060      // Force an update check when requested.
1061      $force_check = ! empty( $_GET['force-check'] );
1062      wp_version_check( array(), $force_check );
1063  
1064      require_once  ABSPATH . 'wp-admin/admin-header.php';
1065      ?>
1066      <div class="wrap">
1067      <h1><?php _e( 'WordPress Updates' ); ?></h1>
1068      <p><?php _e( 'Updates may take several minutes to complete. If there is no feedback after 5 minutes, or if there are errors please refer to the Help section above.' ); ?></p>
1069  
1070      <?php
1071      if ( $upgrade_error ) {
1072          if ( 'themes' === $upgrade_error ) {
1073              $theme_updates = get_theme_updates();
1074              if ( ! empty( $theme_updates ) ) {
1075                  wp_admin_notice(
1076                      __( 'Please select one or more themes to update.' ),
1077                      array(
1078                          'additional_classes' => array( 'error' ),
1079                      )
1080                  );
1081              }
1082          } else {
1083              $plugin_updates = get_plugin_updates();
1084              if ( ! empty( $plugin_updates ) ) {
1085                  wp_admin_notice(
1086                      __( 'Please select one or more plugins to update.' ),
1087                      array(
1088                          'additional_classes' => array( 'error' ),
1089                      )
1090                  );
1091              }
1092          }
1093      }
1094  
1095      $last_update_check = false;
1096      $current           = get_site_transient( 'update_core' );
1097  
1098      if ( $current && isset( $current->last_checked ) ) {
1099          $last_update_check = $current->last_checked + (int) ( (float) get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
1100      }
1101  
1102      echo '<h2 class="wp-current-version">';
1103      /* translators: Current version of WordPress. */
1104      printf( __( 'Current version: %s' ), esc_html( wp_get_wp_version() ) );
1105      echo '</h2>';
1106  
1107      echo '<p class="update-last-checked">';
1108  
1109      printf(
1110          /* translators: 1: Date, 2: Time. */
1111          __( 'Last checked on %1$s at %2$s.' ),
1112          /* translators: Last update date format. See https://www.php.net/manual/datetime.format.php */
1113          date_i18n( __( 'F j, Y' ), $last_update_check ),
1114          /* translators: Last update time format. See https://www.php.net/manual/datetime.format.php */
1115          date_i18n( __( 'g:i a T' ), $last_update_check )
1116      );
1117      echo ' <a href="' . esc_url( self_admin_url( 'update-core.php?force-check=1' ) ) . '">' . __( 'Check again.' ) . '</a>';
1118      echo '</p>';
1119  
1120      if ( current_user_can( 'update_core' ) ) {
1121          core_auto_updates_settings();
1122          core_upgrade_preamble();
1123      }
1124      if ( current_user_can( 'update_plugins' ) ) {
1125          list_plugin_updates();
1126      }
1127      if ( current_user_can( 'update_themes' ) ) {
1128          list_theme_updates();
1129      }
1130      if ( current_user_can( 'update_languages' ) ) {
1131          list_translation_updates();
1132      }
1133  
1134      /**
1135       * Fires after the core, plugin, and theme update tables.
1136       *
1137       * @since 2.9.0
1138       */
1139      do_action( 'core_upgrade_preamble' );
1140      echo '</div>';
1141  
1142      wp_localize_script(
1143          'updates',
1144          '_wpUpdatesItemCounts',
1145          array(
1146              'totals' => wp_get_update_data(),
1147          )
1148      );
1149  
1150      require_once  ABSPATH . 'wp-admin/admin-footer.php';
1151  
1152  } elseif ( 'do-core-upgrade' === $action || 'do-core-reinstall' === $action ) {
1153  
1154      if ( ! current_user_can( 'update_core' ) ) {
1155          wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1156      }
1157  
1158      check_admin_referer( 'upgrade-core' );
1159  
1160      // Do the (un)dismiss actions before headers, so that they can redirect.
1161      if ( isset( $_POST['dismiss'] ) ) {
1162          do_dismiss_core_update();
1163      } elseif ( isset( $_POST['undismiss'] ) ) {
1164          do_undismiss_core_update();
1165      }
1166  
1167      require_once  ABSPATH . 'wp-admin/admin-header.php';
1168      if ( 'do-core-reinstall' === $action ) {
1169          $reinstall = true;
1170      } else {
1171          $reinstall = false;
1172      }
1173  
1174      if ( isset( $_POST['upgrade'] ) ) {
1175          do_core_upgrade( $reinstall );
1176      }
1177  
1178      wp_localize_script(
1179          'updates',
1180          '_wpUpdatesItemCounts',
1181          array(
1182              'totals' => wp_get_update_data(),
1183          )
1184      );
1185  
1186      require_once  ABSPATH . 'wp-admin/admin-footer.php';
1187  
1188  } elseif ( 'do-plugin-upgrade' === $action ) {
1189  
1190      if ( ! current_user_can( 'update_plugins' ) ) {
1191          wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1192      }
1193  
1194      check_admin_referer( 'upgrade-core' );
1195  
1196      if ( isset( $_GET['plugins'] ) ) {
1197          $plugins = explode( ',', $_GET['plugins'] );
1198      } elseif ( isset( $_POST['checked'] ) ) {
1199          $plugins = (array) $_POST['checked'];
1200      } else {
1201          wp_redirect( admin_url( 'update-core.php' ) );
1202          exit;
1203      }
1204  
1205      $url = 'update.php?action=update-selected&plugins=' . urlencode( implode( ',', $plugins ) );
1206      $url = wp_nonce_url( $url, 'bulk-update-plugins' );
1207  
1208      // Used in the HTML title tag.
1209      $title = __( 'Update Plugins' );
1210  
1211      require_once  ABSPATH . 'wp-admin/admin-header.php';
1212      ?>
1213      <div class="wrap">
1214          <h1><?php _e( 'Update Plugins' ); ?></h1>
1215          <iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe>
1216      </div>
1217      <?php
1218  
1219      wp_localize_script(
1220          'updates',
1221          '_wpUpdatesItemCounts',
1222          array(
1223              'totals' => wp_get_update_data(),
1224          )
1225      );
1226  
1227      require_once  ABSPATH . 'wp-admin/admin-footer.php';
1228  
1229  } elseif ( 'do-theme-upgrade' === $action ) {
1230  
1231      if ( ! current_user_can( 'update_themes' ) ) {
1232          wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1233      }
1234  
1235      check_admin_referer( 'upgrade-core' );
1236  
1237      if ( isset( $_GET['themes'] ) ) {
1238          $themes = explode( ',', $_GET['themes'] );
1239      } elseif ( isset( $_POST['checked'] ) ) {
1240          $themes = (array) $_POST['checked'];
1241      } else {
1242          wp_redirect( admin_url( 'update-core.php' ) );
1243          exit;
1244      }
1245  
1246      $url = 'update.php?action=update-selected-themes&themes=' . urlencode( implode( ',', $themes ) );
1247      $url = wp_nonce_url( $url, 'bulk-update-themes' );
1248  
1249      // Used in the HTML title tag.
1250      $title = __( 'Update Themes' );
1251  
1252      require_once  ABSPATH . 'wp-admin/admin-header.php';
1253      ?>
1254      <div class="wrap">
1255          <h1><?php _e( 'Update Themes' ); ?></h1>
1256          <iframe src="<?php echo $url; ?>" style="width: 100%; height: 100%; min-height: 750px;" frameborder="0" title="<?php esc_attr_e( 'Update progress' ); ?>"></iframe>
1257      </div>
1258      <?php
1259  
1260      wp_localize_script(
1261          'updates',
1262          '_wpUpdatesItemCounts',
1263          array(
1264              'totals' => wp_get_update_data(),
1265          )
1266      );
1267  
1268      require_once  ABSPATH . 'wp-admin/admin-footer.php';
1269  
1270  } elseif ( 'do-translation-upgrade' === $action ) {
1271  
1272      if ( ! current_user_can( 'update_languages' ) ) {
1273          wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1274      }
1275  
1276      check_admin_referer( 'upgrade-translations' );
1277  
1278      require_once  ABSPATH . 'wp-admin/admin-header.php';
1279      require_once  ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1280  
1281      $url     = 'update-core.php?action=do-translation-upgrade';
1282      $nonce   = 'upgrade-translations';
1283      $title   = __( 'Update Translations' );
1284      $context = WP_LANG_DIR;
1285  
1286      $upgrader = new Language_Pack_Upgrader( new Language_Pack_Upgrader_Skin( compact( 'url', 'nonce', 'title', 'context' ) ) );
1287      $result   = $upgrader->bulk_upgrade();
1288  
1289      wp_localize_script(
1290          'updates',
1291          '_wpUpdatesItemCounts',
1292          array(
1293              'totals' => wp_get_update_data(),
1294          )
1295      );
1296  
1297      require_once  ABSPATH . 'wp-admin/admin-footer.php';
1298  
1299  } elseif ( 'core-major-auto-updates-settings' === $action ) {
1300  
1301      if ( ! current_user_can( 'update_core' ) ) {
1302          wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
1303      }
1304  
1305      $redirect_url = self_admin_url( 'update-core.php' );
1306  
1307      if ( isset( $_GET['value'] ) ) {
1308          check_admin_referer( 'core-major-auto-updates-nonce' );
1309  
1310          if ( 'enable' === $_GET['value'] ) {
1311              update_site_option( 'auto_update_core_major', 'enabled' );
1312              $redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'enabled', $redirect_url );
1313          } elseif ( 'disable' === $_GET['value'] ) {
1314              update_site_option( 'auto_update_core_major', 'disabled' );
1315              $redirect_url = add_query_arg( 'core-major-auto-updates-saved', 'disabled', $redirect_url );
1316          }
1317      }
1318  
1319      wp_redirect( $redirect_url );
1320      exit;
1321  } else {
1322      /**
1323       * Fires for each custom update action on the WordPress Updates screen.
1324       *
1325       * The dynamic portion of the hook name, `$action`, refers to the
1326       * passed update action. The hook fires in lieu of all available
1327       * default update actions.
1328       *
1329       * @since 3.2.0
1330       */
1331      do_action( "update-core-custom_{$action}" );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
1332  }


Generated : Sat Dec 21 08:20:01 2024 Cross-referenced by PHPXref