- $current = get_option( 'update_core' );
- $locale = get_locale();
-
- if (
- isset( $current->last_checked ) &&
- 43200 > ( time() - $current->last_checked ) &&
- $current->version_checked == $wp_version
- )
- return false;
-
- $new_option = '';
- $new_option->last_checked = time(); // this gets set whether we get a response or not, so if something is down or misconfigured it won't delay the page load for more than 3 seconds, twice a day
- $new_option->version_checked = $wp_version;
-
- $http_request = "GET /core/version-check/1.1/?version=$wp_version&php=$php_version&locale=$locale HTTP/1.0\r\n";
- $http_request .= "Host: api.wordpress.org\r\n";
- $http_request .= 'Content-Type: application/x-www-form-urlencoded; charset=' . get_option('blog_charset') . "\r\n";
- $http_request .= 'User-Agent: WordPress/' . $wp_version . '; ' . get_bloginfo('url') . "\r\n";
- $http_request .= "\r\n";
-
- $response = '';
- if ( false !== ( $fs = @fsockopen( 'api.wordpress.org', 80, $errno, $errstr, 3 ) ) && is_resource($fs) ) {
- fwrite( $fs, $http_request );
- while ( !feof( $fs ) )
- $response .= fgets( $fs, 1160 ); // One TCP-IP packet
- fclose( $fs );
-
- $response = explode("\r\n\r\n", $response, 2);
- if ( !preg_match( '|HTTP/.*? 200|', $response[0] ) )
- return false;
-
- $body = trim( $response[1] );
- $body = str_replace(array("\r\n", "\r"), "\n", $body);
-
- $returns = explode("\n", $body);
-
- $new_option->response = attribute_escape( $returns[0] );
- if ( isset( $returns[1] ) )
- $new_option->url = clean_url( $returns[1] );
- if ( isset( $returns[2] ) )
- $new_option->current = attribute_escape( $returns[2] );
- }
- update_option( 'update_core', $new_option );
+ $current = get_site_transient( 'update_core' );
+ $translations = wp_get_installed_translations( 'core' );
+
+ // Invalidate the transient when $wp_version changes
+ if ( is_object( $current ) && $wp_version != $current->version_checked )
+ $current = false;
+
+ if ( ! is_object($current) ) {
+ $current = new stdClass;
+ $current->updates = array();
+ $current->version_checked = $wp_version;
+ }
+
+ if ( ! empty( $extra_stats ) )
+ $force_check = true;
+
+ // Wait 60 seconds between multiple version check requests
+ $timeout = 60;
+ $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );
+ if ( ! $force_check && $time_not_changed ) {
+ return;
+ }
+
+ /**
+ * Filter the locale requested for WordPress core translations.
+ *
+ * @since 2.8.0
+ *
+ * @param string $locale Current locale.
+ */
+ $locale = apply_filters( 'core_version_check_locale', get_locale() );
+
+ // Update last_checked for current to prevent multiple blocking requests if request hangs
+ $current->last_checked = time();
+ set_site_transient( 'update_core', $current );
+
+ if ( method_exists( $wpdb, 'db_version' ) )
+ $mysql_version = preg_replace('/[^0-9.].*/', '', $wpdb->db_version());
+ else
+ $mysql_version = 'N/A';
+
+ if ( is_multisite() ) {
+ $user_count = get_user_count();
+ $num_blogs = get_blog_count();
+ $wp_install = network_site_url();
+ $multisite_enabled = 1;
+ } else {
+ $user_count = count_users();
+ $user_count = $user_count['total_users'];
+ $multisite_enabled = 0;
+ $num_blogs = 1;
+ $wp_install = home_url( '/' );
+ }
+
+ $query = array(
+ 'version' => $wp_version,
+ 'php' => $php_version,
+ 'locale' => $locale,
+ 'mysql' => $mysql_version,
+ 'local_package' => isset( $wp_local_package ) ? $wp_local_package : '',
+ 'blogs' => $num_blogs,
+ 'users' => $user_count,
+ 'multisite_enabled' => $multisite_enabled,
+ );
+
+ $post_body = array(
+ 'translations' => wp_json_encode( $translations ),
+ );
+
+ if ( is_array( $extra_stats ) )
+ $post_body = array_merge( $post_body, $extra_stats );
+
+ $url = $http_url = 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, null, '&' );
+ if ( $ssl = wp_http_supports( array( 'ssl' ) ) )
+ $url = set_url_scheme( $url, 'https' );
+
+ $options = array(
+ 'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ),
+ 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
+ 'headers' => array(
+ 'wp_install' => $wp_install,
+ 'wp_blog' => home_url( '/' )
+ ),
+ 'body' => $post_body,
+ );
+
+ $response = wp_remote_post( $url, $options );
+ if ( $ssl && is_wp_error( $response ) ) {
+ trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://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 );
+ $response = wp_remote_post( $http_url, $options );
+ }
+
+ if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
+ return;
+ }
+
+ $body = trim( wp_remote_retrieve_body( $response ) );
+ $body = json_decode( $body, true );
+
+ if ( ! is_array( $body ) || ! isset( $body['offers'] ) ) {
+ return;
+ }
+
+ $offers = $body['offers'];
+
+ foreach ( $offers as &$offer ) {
+ foreach ( $offer as $offer_key => $value ) {
+ if ( 'packages' == $offer_key )
+ $offer['packages'] = (object) array_intersect_key( array_map( 'esc_url', $offer['packages'] ),
+ array_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial', 'rollback' ), '' ) );
+ elseif ( 'download' == $offer_key )
+ $offer['download'] = esc_url( $value );
+ else
+ $offer[ $offer_key ] = esc_html( $value );
+ }
+ $offer = (object) array_intersect_key( $offer, array_fill_keys( array( 'response', 'download', 'locale',
+ 'packages', 'current', 'version', 'php_version', 'mysql_version', 'new_bundled', 'partial_version', 'notify_email', 'support_email', 'new_files' ), '' ) );
+ }
+
+ $updates = new stdClass();
+ $updates->updates = $offers;
+ $updates->last_checked = time();
+ $updates->version_checked = $wp_version;
+
+ if ( isset( $body['translations'] ) )
+ $updates->translations = $body['translations'];
+
+ set_site_transient( 'update_core', $updates );
+
+ if ( ! empty( $body['ttl'] ) ) {
+ $ttl = (int) $body['ttl'];
+ if ( $ttl && ( time() + $ttl < wp_next_scheduled( 'wp_version_check' ) ) ) {
+ // Queue an event to re-run the update check in $ttl seconds.
+ wp_schedule_single_event( time() + $ttl, 'wp_version_check' );
+ }
+ }
+
+ // Trigger a background updates check if running non-interactively, and we weren't called from the update handler.
+ if ( defined( 'DOING_CRON' ) && DOING_CRON && ! doing_action( 'wp_maybe_auto_update' ) ) {
+ do_action( 'wp_maybe_auto_update' );
+ }