[ Index ]

WordPress Cross Reference

title

Body

[close]

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

   1  <?php
   2  /**
   3   * WordPress Administration Update API
   4   *
   5   * @package WordPress
   6   * @subpackage Administration
   7   */
   8  
   9  /**
  10   * Selects the first update version from the update_core option
  11   *
  12   * @return object the response from the API
  13   */
  14  function get_preferred_from_update_core() {
  15      $updates = get_core_updates();
  16      if ( ! is_array( $updates ) )
  17          return false;
  18      if ( empty( $updates ) )
  19          return (object) array( 'response' => 'latest' );
  20      return $updates[0];
  21  }
  22  
  23  /**
  24   * Get available core updates
  25   *
  26   * @param array $options Set $options['dismissed'] to true to show dismissed upgrades too,
  27   *     set $options['available'] to false to skip not-dismissed updates.
  28   * @return array Array of the update objects
  29   */
  30  function get_core_updates( $options = array() ) {
  31      $options = array_merge( array( 'available' => true, 'dismissed' => false ), $options );
  32      $dismissed = get_site_option( 'dismissed_update_core' );
  33  
  34      if ( ! is_array( $dismissed ) )
  35          $dismissed = array();
  36  
  37      $from_api = get_site_transient( 'update_core' );
  38  
  39      if ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) )
  40          return false;
  41  
  42      $updates = $from_api->updates;
  43      $result = array();
  44      foreach ( $updates as $update ) {
  45          if ( $update->response == 'autoupdate' )
  46              continue;
  47  
  48          if ( array_key_exists( $update->current . '|' . $update->locale, $dismissed ) ) {
  49              if ( $options['dismissed'] ) {
  50                  $update->dismissed = true;
  51                  $result[] = $update;
  52              }
  53          } else {
  54              if ( $options['available'] ) {
  55                  $update->dismissed = false;
  56                  $result[] = $update;
  57              }
  58          }
  59      }
  60      return $result;
  61  }
  62  
  63  /**
  64   * Gets the best available (and enabled) Auto-Update for WordPress Core.
  65   *
  66   * If there's 1.2.3 and 1.3 on offer, it'll choose 1.3 if the install allows it, else, 1.2.3
  67   *
  68   * @since 3.7.0
  69   *
  70   * @return bool|array False on failure, otherwise the core update offering.
  71   */
  72  function find_core_auto_update() {
  73      $updates = get_site_transient( 'update_core' );
  74      if ( ! $updates || empty( $updates->updates ) )
  75          return false;
  76  
  77      include_once  ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  78  
  79      $auto_update = false;
  80      $upgrader = new WP_Automatic_Updater;
  81      foreach ( $updates->updates as $update ) {
  82          if ( 'autoupdate' != $update->response )
  83              continue;
  84  
  85          if ( ! $upgrader->should_update( 'core', $update, ABSPATH ) )
  86              continue;
  87  
  88          if ( ! $auto_update || version_compare( $update->current, $auto_update->current, '>' ) )
  89              $auto_update = $update;
  90      }
  91      return $auto_update;
  92  }
  93  
  94  /**
  95   * Gets and caches the checksums for the given version of WordPress.
  96   *
  97   * @since 3.7.0
  98   *
  99   * @param string $version Version string to query.
 100   * @param string $locale  Locale to query.
 101   * @return bool|array False on failure. An array of checksums on success.
 102   */
 103  function get_core_checksums( $version, $locale ) {
 104      $return = array();
 105  
 106      $url = $http_url = 'http://api.wordpress.org/core/checksums/1.0/?' . http_build_query( compact( 'version', 'locale' ), null, '&' );
 107  
 108      if ( $ssl = wp_http_supports( array( 'ssl' ) ) )
 109          $url = set_url_scheme( $url, 'https' );
 110  
 111      $options = array(
 112          'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ),
 113      );
 114  
 115      $response = wp_remote_get( $url, $options );
 116      if ( $ssl && is_wp_error( $response ) ) {
 117          trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="http://wordpress.org/support/">support forums</a>.' ) . ' ' . '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)', headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );
 118          $response = wp_remote_get( $http_url, $options );
 119      }
 120  
 121      if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) )
 122          return false;
 123  
 124      $body = trim( wp_remote_retrieve_body( $response ) );
 125      $body = json_decode( $body, true );
 126  
 127      if ( ! is_array( $body ) || ! isset( $body['checksums'] ) || ! is_array( $body['checksums'] ) )
 128          return false;
 129  
 130      return $body['checksums'];
 131  }
 132  
 133  function dismiss_core_update( $update ) {
 134      $dismissed = get_site_option( 'dismissed_update_core' );
 135      $dismissed[ $update->current . '|' . $update->locale ] = true;
 136      return update_site_option( 'dismissed_update_core', $dismissed );
 137  }
 138  
 139  function undismiss_core_update( $version, $locale ) {
 140      $dismissed = get_site_option( 'dismissed_update_core' );
 141      $key = $version . '|' . $locale;
 142  
 143      if ( ! isset( $dismissed[$key] ) )
 144          return false;
 145  
 146      unset( $dismissed[$key] );
 147      return update_site_option( 'dismissed_update_core', $dismissed );
 148  }
 149  
 150  function find_core_update( $version, $locale ) {
 151      $from_api = get_site_transient( 'update_core' );
 152  
 153      if ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) )
 154          return false;
 155  
 156      $updates = $from_api->updates;
 157      foreach ( $updates as $update ) {
 158          if ( $update->current == $version && $update->locale == $locale )
 159              return $update;
 160      }
 161      return false;
 162  }
 163  
 164  function core_update_footer( $msg = '' ) {
 165      if ( !current_user_can('update_core') )
 166          return sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) );
 167  
 168      $cur = get_preferred_from_update_core();
 169      if ( ! is_object( $cur ) )
 170          $cur = new stdClass;
 171  
 172      if ( ! isset( $cur->current ) )
 173          $cur->current = '';
 174  
 175      if ( ! isset( $cur->url ) )
 176          $cur->url = '';
 177  
 178      if ( ! isset( $cur->response ) )
 179          $cur->response = '';
 180  
 181      switch ( $cur->response ) {
 182      case 'development' :
 183          return sprintf( __( 'You are using a development version (%1$s). Cool! Please <a href="%2$s">stay updated</a>.' ), get_bloginfo( 'version', 'display' ), network_admin_url( 'update-core.php' ) );
 184      break;
 185  
 186      case 'upgrade' :
 187          return sprintf( '<strong>'.__( '<a href="%1$s">Get Version %2$s</a>' ).'</strong>', network_admin_url( 'update-core.php' ), $cur->current);
 188      break;
 189  
 190      case 'latest' :
 191      default :
 192          return sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) );
 193      break;
 194      }
 195  }
 196  add_filter( 'update_footer', 'core_update_footer' );
 197  
 198  function update_nag() {
 199      if ( is_multisite() && !current_user_can('update_core') )
 200          return false;
 201  
 202      global $pagenow;
 203  
 204      if ( 'update-core.php' == $pagenow )
 205          return;
 206  
 207      $cur = get_preferred_from_update_core();
 208  
 209      if ( ! isset( $cur->response ) || $cur->response != 'upgrade' )
 210          return false;
 211  
 212      if ( current_user_can('update_core') ) {
 213          $msg = sprintf( __('<a href="http://codex.wordpress.org/Version_%1$s">WordPress %1$s</a> is available! <a href="%2$s">Please update now</a>.'), $cur->current, network_admin_url( 'update-core.php' ) );
 214      } else {
 215          $msg = sprintf( __('<a href="http://codex.wordpress.org/Version_%1$s">WordPress %1$s</a> is available! Please notify the site administrator.'), $cur->current );
 216      }
 217      echo "<div class='update-nag'>$msg</div>";
 218  }
 219  add_action( 'admin_notices', 'update_nag', 3 );
 220  add_action( 'network_admin_notices', 'update_nag', 3 );
 221  
 222  // Called directly from dashboard
 223  function update_right_now_message() {
 224      $msg = sprintf( __( 'You are using <span class="b">WordPress %s</span>.' ), get_bloginfo( 'version', 'display' ) );
 225  
 226      if ( current_user_can('update_core') ) {
 227          $cur = get_preferred_from_update_core();
 228  
 229          if ( isset( $cur->response ) && $cur->response == 'upgrade' )
 230              $msg .= " <a href='" . network_admin_url( 'update-core.php' ) . "' class='button'>" . sprintf( __('Update to %s'), $cur->current ? $cur->current : __( 'Latest' ) ) . '</a>';
 231      }
 232  
 233      echo "<span id='wp-version-message'>$msg</span>";
 234  }
 235  
 236  function get_plugin_updates() {
 237      $all_plugins = get_plugins();
 238      $upgrade_plugins = array();
 239      $current = get_site_transient( 'update_plugins' );
 240      foreach ( (array)$all_plugins as $plugin_file => $plugin_data) {
 241          if ( isset( $current->response[ $plugin_file ] ) ) {
 242              $upgrade_plugins[ $plugin_file ] = (object) $plugin_data;
 243              $upgrade_plugins[ $plugin_file ]->update = $current->response[ $plugin_file ];
 244          }
 245      }
 246  
 247      return $upgrade_plugins;
 248  }
 249  
 250  function wp_plugin_update_rows() {
 251      if ( !current_user_can('update_plugins' ) )
 252          return;
 253  
 254      $plugins = get_site_transient( 'update_plugins' );
 255      if ( isset($plugins->response) && is_array($plugins->response) ) {
 256          $plugins = array_keys( $plugins->response );
 257          foreach( $plugins as $plugin_file ) {
 258              add_action( "after_plugin_row_$plugin_file", 'wp_plugin_update_row', 10, 2 );
 259          }
 260      }
 261  }
 262  add_action( 'admin_init', 'wp_plugin_update_rows' );
 263  
 264  function wp_plugin_update_row( $file, $plugin_data ) {
 265      $current = get_site_transient( 'update_plugins' );
 266      if ( !isset( $current->response[ $file ] ) )
 267          return false;
 268  
 269      $r = $current->response[ $file ];
 270  
 271      $plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
 272      $plugin_name = wp_kses( $plugin_data['Name'], $plugins_allowedtags );
 273  
 274      $details_url = self_admin_url('plugin-install.php?tab=plugin-information&plugin=' . $r->slug . '&section=changelog&TB_iframe=true&width=600&height=800');
 275  
 276      $wp_list_table = _get_list_table('WP_Plugins_List_Table');
 277  
 278      if ( is_network_admin() || !is_multisite() ) {
 279          echo '<tr class="plugin-update-tr"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange"><div class="update-message">';
 280  
 281          if ( ! current_user_can('update_plugins') )
 282              printf( __('There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%3$s">View version %4$s details</a>.'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version );
 283          else if ( empty($r->package) )
 284              printf( __('There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%3$s">View version %4$s details</a>. <em>Automatic update is unavailable for this plugin.</em>'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version );
 285          else
 286              printf( __('There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%3$s">View version %4$s details</a> or <a href="%5$s">update now</a>.'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version, wp_nonce_url( self_admin_url('update.php?action=upgrade-plugin&plugin=') . $file, 'upgrade-plugin_' . $file) );
 287  
 288          /**
 289           * Fires at the end of the update message container in each
 290           * row of the plugins list table.
 291           *
 292           * The dynamic portion of the hook name, $file, refers to the path
 293           * of the plugin's primary file relative to the plugins directory.
 294           *
 295           * @since 2.8.0
 296           *
 297           * @param array $plugin_data {
 298           *     An array of plugin metadata.
 299           *
 300           *     @type string $name         The human-readable name of the plugin.
 301           *     @type string $plugin_uri   Plugin URI.
 302           *     @type string $version      Plugin version.
 303           *     @type string $description  Plugin description.
 304           *     @type string $author       Plugin author.
 305           *     @type string $author_uri   Plugin author URI.
 306           *     @type string $text_domain  Plugin text domain.
 307           *     @type string $domain_path  Relative path to the plugin's .mo file(s).
 308           *     @type bool   $network      Whether the plugin can only be activated network wide.
 309           *     @type string $title        The human-readable title of the plugin.
 310           *     @type string $author_name  Plugin author's name.
 311           *     @type bool   $update       Whether there's an available update. Default null.
 312            * }
 313            * @param array $r {
 314            *     An array of metadata about the available plugin update.
 315            *
 316            *     @type int    $id           Plugin ID.
 317            *     @type string $slug         Plugin slug.
 318            *     @type string $new_version  New plugin version.
 319            *     @type string $url          Plugin URL.
 320            *     @type string $package      Plugin update package URL.
 321            * }
 322           */
 323          do_action( "in_plugin_update_message-{$file}", $plugin_data, $r );
 324  
 325          echo '</div></td></tr>';
 326      }
 327  }
 328  
 329  function get_theme_updates() {
 330      $themes = wp_get_themes();
 331      $current = get_site_transient('update_themes');
 332  
 333      if ( ! isset( $current->response ) )
 334          return array();
 335  
 336      $update_themes = array();
 337      foreach ( $current->response as $stylesheet => $data ) {
 338          $update_themes[ $stylesheet ] = wp_get_theme( $stylesheet );
 339          $update_themes[ $stylesheet ]->update = $data;
 340      }
 341  
 342      return $update_themes;
 343  }
 344  
 345  function wp_theme_update_rows() {
 346      if ( !current_user_can('update_themes' ) )
 347          return;
 348  
 349      $themes = get_site_transient( 'update_themes' );
 350      if ( isset($themes->response) && is_array($themes->response) ) {
 351          $themes = array_keys( $themes->response );
 352  
 353          foreach( $themes as $theme ) {
 354              add_action( "after_theme_row_$theme", 'wp_theme_update_row', 10, 2 );
 355          }
 356      }
 357  }
 358  add_action( 'admin_init', 'wp_theme_update_rows' );
 359  
 360  function wp_theme_update_row( $theme_key, $theme ) {
 361      $current = get_site_transient( 'update_themes' );
 362      if ( !isset( $current->response[ $theme_key ] ) )
 363          return false;
 364      $r = $current->response[ $theme_key ];
 365      $themes_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
 366      $theme_name = wp_kses( $theme['Name'], $themes_allowedtags );
 367  
 368      $details_url = add_query_arg( array( 'TB_iframe' => 'true', 'width' => 1024, 'height' => 800 ), $current->response[ $theme_key ]['url'] );
 369  
 370      $wp_list_table = _get_list_table('WP_MS_Themes_List_Table');
 371  
 372      echo '<tr class="plugin-update-tr"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange"><div class="update-message">';
 373      if ( ! current_user_can('update_themes') )
 374          printf( __('There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%3$s">View version %4$s details</a>.'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r->new_version );
 375      else if ( empty( $r['package'] ) )
 376          printf( __('There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%3$s">View version %4$s details</a>. <em>Automatic update is unavailable for this theme.</em>'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r['new_version'] );
 377      else
 378          printf( __('There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%3$s">View version %4$s details</a> or <a href="%5$s">update now</a>.'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r['new_version'], wp_nonce_url( self_admin_url('update.php?action=upgrade-theme&theme=') . $theme_key, 'upgrade-theme_' . $theme_key) );
 379  
 380      /**
 381       * Fires at the end of the update message container in each
 382       * row of the themes list table.
 383       *
 384       * The dynamic portion of the hook name, $theme_key, refers to
 385       * the theme slug as found in the WordPress.org themes repository.
 386       *
 387       * @since 3.1.0
 388       *
 389       * @param WP_Theme $theme The WP_Theme object.
 390       * @param array    $r {
 391       *     An array of metadata about the available theme update.
 392       *
 393       *     @type string $new_version New theme version.
 394       *     @type string $url         Theme URL.
 395       *     @type string $package     Theme update package URL.
 396       * }
 397       */
 398      do_action( "in_theme_update_message-{$theme_key}", $theme, $r );
 399  
 400      echo '</div></td></tr>';
 401  }
 402  
 403  function maintenance_nag() {
 404      include  ABSPATH . WPINC . '/version.php'; // include an unmodified $wp_version
 405      global $upgrading;
 406      $nag = isset( $upgrading );
 407      if ( ! $nag ) {
 408          $failed = get_site_option( 'auto_core_update_failed' );
 409          /*
 410           * If an update failed critically, we may have copied over version.php but not other files.
 411           * In that case, if the install claims we're running the version we attempted, nag.
 412           * This is serious enough to err on the side of nagging.
 413           *
 414           * If we simply failed to update before we tried to copy any files, then assume things are
 415           * OK if they are now running the latest.
 416           *
 417           * This flag is cleared whenever a successful update occurs using Core_Upgrader.
 418           */
 419          $comparison = ! empty( $failed['critical'] ) ? '>=' : '>';
 420          if ( version_compare( $failed['attempted'], $wp_version, $comparison ) )
 421              $nag = true;
 422      }
 423  
 424      if ( ! $nag )
 425          return false;
 426  
 427      if ( current_user_can('update_core') )
 428          $msg = sprintf( __('An automated WordPress update has failed to complete - <a href="%s">please attempt the update again now</a>.'), 'update-core.php' );
 429      else
 430          $msg = __('An automated WordPress update has failed to complete! Please notify the site administrator.');
 431  
 432      echo "<div class='update-nag'>$msg</div>";
 433  }
 434  add_action( 'admin_notices', 'maintenance_nag' );
 435  add_action( 'network_admin_notices', 'maintenance_nag' );


Generated: Tue Mar 25 01:41:18 2014 WordPress honlapkészítés: online1.hu