wp/wp-includes/update.php
changeset 22 8c2e4d02f4ef
parent 21 48c4eec2b7e6
--- a/wp/wp-includes/update.php	Fri Sep 05 18:40:08 2025 +0200
+++ b/wp/wp-includes/update.php	Fri Sep 05 18:52:52 2025 +0200
@@ -6,10 +6,15 @@
  * @since 2.3.0
  */
 
+// Don't load directly.
+if ( ! defined( 'ABSPATH' ) ) {
+	die( '-1' );
+}
+
 /**
  * Checks WordPress version against the newest version.
  *
- * The WordPress version, PHP version, and locale is sent.
+ * The WordPress version, PHP version, and locale is sent to api.wordpress.org.
  *
  * Checks against the WordPress server at api.wordpress.org. Will only check
  * if WordPress isn't installing.
@@ -31,22 +36,20 @@
 		return;
 	}
 
-	// Include an unmodified $wp_version.
-	require ABSPATH . WPINC . '/version.php';
 	$php_version = PHP_VERSION;
 
 	$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 ) {
+	if ( is_object( $current ) && wp_get_wp_version() !== $current->version_checked ) {
 		$current = false;
 	}
 
 	if ( ! is_object( $current ) ) {
 		$current                  = new stdClass();
 		$current->updates         = array();
-		$current->version_checked = $wp_version;
+		$current->version_checked = wp_get_wp_version();
 	}
 
 	if ( ! empty( $extra_stats ) ) {
@@ -95,7 +98,7 @@
 	$extensions = get_loaded_extensions();
 	sort( $extensions, SORT_STRING | SORT_FLAG_CASE );
 	$query = array(
-		'version'            => $wp_version,
+		'version'            => wp_get_wp_version(),
 		'php'                => $php_version,
 		'locale'             => $locale,
 		'mysql'              => $mysql_version,
@@ -117,24 +120,28 @@
 		// Filter to supported values.
 		$gd_info = array_filter( $gd_info );
 
-		// Add data for GD WebP and AVIF support.
+		// Add data for GD WebP, AVIF, HEIC and JPEG XL support.
 		$query['image_support']['gd'] = array_keys(
 			array_filter(
 				array(
 					'webp' => isset( $gd_info['WebP Support'] ),
 					'avif' => isset( $gd_info['AVIF Support'] ),
+					'heic' => isset( $gd_info['HEIC Support'] ),
+					'jxl'  => isset( $gd_info['JXL Support'] ),
 				)
 			)
 		);
 	}
 
 	if ( class_exists( 'Imagick' ) ) {
-		// Add data for Imagick WebP and AVIF support.
+		// Add data for Imagick WebP, AVIF, HEIC and JPEG XL support.
 		$query['image_support']['imagick'] = array_keys(
 			array_filter(
 				array(
 					'webp' => ! empty( Imagick::queryFormats( 'WEBP' ) ),
 					'avif' => ! empty( Imagick::queryFormats( 'AVIF' ) ),
+					'heic' => ! empty( Imagick::queryFormats( 'HEIC' ) ),
+					'jxl'  => ! empty( Imagick::queryFormats( 'JXL' ) ),
 				)
 			)
 		);
@@ -147,6 +154,7 @@
 	 * Please exercise extreme caution.
 	 *
 	 * @since 4.9.0
+	 * @since 6.1.0 Added `$extensions`, `$platform_flags`, and `$image_support` to the `$query` parameter.
 	 *
 	 * @param array $query {
 	 *     Version check query arguments.
@@ -160,6 +168,9 @@
 	 *     @type int    $users              Number of users on this WordPress installation.
 	 *     @type int    $multisite_enabled  Whether this WordPress installation uses Multisite.
 	 *     @type int    $initial_db_version Database version of WordPress at time of installation.
+	 *     @type array  $extensions         List of PHP extensions and their versions.
+	 *     @type array  $platform_flags     List containing the operating system name and bit support.
+	 *     @type array  $image_support      List of image formats supported by GD and Imagick.
 	 * }
 	 */
 	$query = apply_filters( 'core_version_check_query_args', $query );
@@ -191,7 +202,7 @@
 
 	$options = array(
 		'timeout'    => $doing_cron ? 30 : 3,
-		'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
+		'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ),
 		'headers'    => array(
 			'wp_install' => $wp_install,
 			'wp_blog'    => home_url( '/' ),
@@ -266,7 +277,7 @@
 	$updates                  = new stdClass();
 	$updates->updates         = $offers;
 	$updates->last_checked    = time();
-	$updates->version_checked = $wp_version;
+	$updates->version_checked = wp_get_wp_version();
 
 	if ( isset( $body['translations'] ) ) {
 		$updates->translations = $body['translations'];
@@ -299,7 +310,7 @@
  *
  * Despite its name this function does not actually perform any updates, it only checks for available updates.
  *
- * A list of all plugins installed is sent to WP, along with the site locale.
+ * A list of all plugins installed is sent to api.wordpress.org, along with the site locale.
  *
  * Checks against the WordPress server at api.wordpress.org. Will only check
  * if WordPress isn't installing.
@@ -315,9 +326,6 @@
 		return;
 	}
 
-	// Include an unmodified $wp_version.
-	require ABSPATH . WPINC . '/version.php';
-
 	// If running blog-side, bail unless we've not checked in the last 12 hours.
 	if ( ! function_exists( 'get_plugins' ) ) {
 		require_once ABSPATH . 'wp-admin/includes/plugin.php';
@@ -333,12 +341,6 @@
 		$current = new stdClass();
 	}
 
-	$updates               = new stdClass();
-	$updates->last_checked = time();
-	$updates->response     = array();
-	$updates->translations = array();
-	$updates->no_update    = array();
-
 	$doing_cron = wp_doing_cron();
 
 	// Check for update on a different schedule, depending on the page.
@@ -367,8 +369,6 @@
 		$plugin_changed = false;
 
 		foreach ( $plugins as $file => $p ) {
-			$updates->checked[ $file ] = $p['Version'];
-
 			if ( ! isset( $current->checked[ $file ] ) || (string) $current->checked[ $file ] !== (string) $p['Version'] ) {
 				$plugin_changed = true;
 			}
@@ -423,7 +423,7 @@
 			'locale'       => wp_json_encode( $locales ),
 			'all'          => wp_json_encode( true ),
 		),
-		'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
+		'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ),
 	);
 
 	if ( $extra_stats ) {
@@ -457,6 +457,15 @@
 		return;
 	}
 
+	$updates               = new stdClass();
+	$updates->last_checked = time();
+	$updates->response     = array();
+	$updates->translations = array();
+	$updates->no_update    = array();
+	foreach ( $plugins as $file => $p ) {
+		$updates->checked[ $file ] = $p['Version'];
+	}
+
 	$response = json_decode( wp_remote_retrieve_body( $raw_response ), true );
 
 	if ( $response && is_array( $response ) ) {
@@ -484,19 +493,19 @@
 		 * @param array|false $update {
 		 *     The plugin update data with the latest details. Default false.
 		 *
-		 *     @type string $id           Optional. ID of the plugin for update purposes, should be a URI
-		 *                                specified in the `Update URI` header field.
-		 *     @type string $slug         Slug of the plugin.
-		 *     @type string $version      The version of the plugin.
-		 *     @type string $url          The URL for details of the plugin.
-		 *     @type string $package      Optional. The update ZIP for the plugin.
-		 *     @type string $tested       Optional. The version of WordPress the plugin is tested against.
-		 *     @type string $requires_php Optional. The version of PHP which the plugin requires.
-		 *     @type bool   $autoupdate   Optional. Whether the plugin should automatically update.
-		 *     @type array  $icons        Optional. Array of plugin icons.
-		 *     @type array  $banners      Optional. Array of plugin banners.
-		 *     @type array  $banners_rtl  Optional. Array of plugin RTL banners.
-		 *     @type array  $translations {
+		 *     @type string   $id           Optional. ID of the plugin for update purposes, should be a URI
+		 *                                  specified in the `Update URI` header field.
+		 *     @type string   $slug         Slug of the plugin.
+		 *     @type string   $version      The version of the plugin.
+		 *     @type string   $url          The URL for details of the plugin.
+		 *     @type string   $package      Optional. The update ZIP for the plugin.
+		 *     @type string   $tested       Optional. The version of WordPress the plugin is tested against.
+		 *     @type string   $requires_php Optional. The version of PHP which the plugin requires.
+		 *     @type bool     $autoupdate   Optional. Whether the plugin should automatically update.
+		 *     @type string[] $icons        Optional. Array of plugin icons.
+		 *     @type string[] $banners      Optional. Array of plugin banners.
+		 *     @type string[] $banners_rtl  Optional. Array of plugin RTL banners.
+		 *     @type array    $translations {
 		 *         Optional. List of translation updates for the plugin.
 		 *
 		 *         @type string $language   The language the translation update is for.
@@ -574,7 +583,7 @@
  *
  * Despite its name this function does not actually perform any updates, it only checks for available updates.
  *
- * A list of all themes installed is sent to WP, along with the site locale.
+ * A list of all themes installed is sent to api.wordpress.org, along with the site locale.
  *
  * Checks against the WordPress server at api.wordpress.org. Will only check
  * if WordPress isn't installing.
@@ -590,9 +599,6 @@
 		return;
 	}
 
-	// Include an unmodified $wp_version.
-	require ABSPATH . WPINC . '/version.php';
-
 	$installed_themes = wp_get_themes();
 	$translations     = wp_get_installed_translations( 'themes' );
 
@@ -705,7 +711,7 @@
 			'translations' => wp_json_encode( $translations ),
 			'locale'       => wp_json_encode( $locales ),
 		),
-		'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),
+		'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ),
 	);
 
 	if ( $extra_stats ) {
@@ -890,7 +896,12 @@
  *
  * @since 3.3.0
  *
- * @return array
+ * @return array {
+ *     Fetched update data.
+ *
+ *     @type int[]   $counts       An array of counts for available plugin, theme, and WordPress updates.
+ *     @type string  $update_title Titles of available updates.
+ * }
  */
 function wp_get_update_data() {
 	$counts = array(
@@ -973,7 +984,7 @@
 	 * @param array $update_data {
 	 *     Fetched update data.
 	 *
-	 *     @type array   $counts       An array of counts for available plugin, theme, and WordPress updates.
+	 *     @type int[]   $counts       An array of counts for available plugin, theme, and WordPress updates.
 	 *     @type string  $update_title Titles of available updates.
 	 * }
 	 * @param array $titles An array of update counts and UI strings for available updates.
@@ -985,18 +996,13 @@
  * Determines whether core should be updated.
  *
  * @since 2.8.0
- *
- * @global string $wp_version The WordPress version string.
  */
 function _maybe_update_core() {
-	// Include an unmodified $wp_version.
-	require ABSPATH . WPINC . '/version.php';
-
 	$current = get_site_transient( 'update_core' );
 
 	if ( isset( $current->last_checked, $current->version_checked )
 		&& 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked )
-		&& $current->version_checked === $wp_version
+		&& wp_get_wp_version() === $current->version_checked
 	) {
 		return;
 	}
@@ -1110,14 +1116,12 @@
  * @access private
  *
  * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
- *
- * @return void|WP_Error Void on success, or a WP_Error object on failure.
  */
 function _wp_delete_all_temp_backups() {
 	global $wp_filesystem;
 
 	if ( ! function_exists( 'WP_Filesystem' ) ) {
-		require_once ABSPATH . '/wp-admin/includes/file.php';
+		require_once ABSPATH . 'wp-admin/includes/file.php';
 	}
 
 	ob_start();
@@ -1125,15 +1129,17 @@
 	ob_end_clean();
 
 	if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
-		return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
+		wp_trigger_error( __FUNCTION__, __( 'Could not access filesystem.' ) );
+		return;
 	}
 
 	if ( ! $wp_filesystem->wp_content_dir() ) {
-		return new WP_Error(
-			'fs_no_content_dir',
+		wp_trigger_error(
+			__FUNCTION__,
 			/* translators: %s: Directory name. */
 			sprintf( __( 'Unable to locate WordPress content directory (%s).' ), 'wp-content' )
 		);
+		return;
 	}
 
 	$temp_backup_dir = $wp_filesystem->wp_content_dir() . 'upgrade-temp-backup/';