Commit 85d695ad5f for wordpress.org

commit 85d695ad5f5b59bd6c9956d6c1d0a7676806b9b4
Author: John Blackbourn <johnbillion@git.wordpress.org>
Date:   Fri Jan 9 11:47:48 2026 +0000

    General: Increase the minimum supported version of PHP to 7.4.

    Props justlevine, masteradhoc, samiamnot, matt, bradshawtm, 4thhubbard, desrosj, jorbin, westonruter, peterwilsoncc, johnbillion

    Fixes #62622

    Built from https://develop.svn.wordpress.org/trunk@61459


    git-svn-id: http://core.svn.wordpress.org/trunk@60771 1a063a9b-81f0-0310-95a4-ce76da25c4cd

diff --git a/readme.html b/readme.html
index 8696b0505a..c8dd83cdbd 100644
--- a/readme.html
+++ b/readme.html
@@ -52,7 +52,7 @@

 <h2>System Requirements</h2>
 <ul>
-	<li><a href="https://www.php.net/">PHP</a> version <strong>7.2.24</strong> or greater.</li>
+	<li><a href="https://www.php.net/">PHP</a> version <strong>7.4</strong> or greater.</li>
 	<li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.5.5</strong> or greater.</li>
 </ul>

diff --git a/wp-admin/includes/class-wp-site-health.php b/wp-admin/includes/class-wp-site-health.php
index 493928677b..dd537296a8 100644
--- a/wp-admin/includes/class-wp-site-health.php
+++ b/wp-admin/includes/class-wp-site-health.php
@@ -965,6 +965,7 @@ class WP_Site_Health {
 				'function' => 'mysqli_connect',
 				'required' => false,
 			),
+			// Sodium was introduced in PHP 7.2, but the extension may not be enabled.
 			'libsodium' => array(
 				'constant'            => 'SODIUM_LIBRARY_VERSION',
 				'required'            => false,
diff --git a/wp-admin/includes/misc.php b/wp-admin/includes/misc.php
index df95166788..6c00a0ffb1 100644
--- a/wp-admin/includes/misc.php
+++ b/wp-admin/includes/misc.php
@@ -1621,8 +1621,8 @@ function wp_check_php_version() {

 	$response['is_lower_than_future_minimum'] = false;

-	// The minimum supported PHP version will be updated to 7.4 in the future. Check if the current version is lower.
-	if ( version_compare( $version, '7.4', '<' ) ) {
+	// The minimum supported PHP version will be updated to at least 8.0 in the future. Check if the current version is lower.
+	if ( version_compare( $version, '8.0', '<' ) ) {
 		$response['is_lower_than_future_minimum'] = true;

 		// Force showing of warnings.
diff --git a/wp-includes/compat.php b/wp-includes/compat.php
index af733c830d..3ac1372fdc 100644
--- a/wp-includes/compat.php
+++ b/wp-includes/compat.php
@@ -296,80 +296,11 @@ if ( ! function_exists( 'utf8_decode' ) ) :
 	endif;
 endif;

-// sodium_crypto_box() was introduced in PHP 7.2.
+// sodium_crypto_box() was introduced with Sodium in PHP 7.2, but the extension may not be enabled.
 if ( ! function_exists( 'sodium_crypto_box' ) ) {
 	require ABSPATH . WPINC . '/sodium_compat/autoload.php';
 }

-if ( ! function_exists( 'is_countable' ) ) {
-	/**
-	 * Polyfill for is_countable() function added in PHP 7.3.
-	 *
-	 * Verify that the content of a variable is an array or an object
-	 * implementing the Countable interface.
-	 *
-	 * @since 4.9.6
-	 *
-	 * @param mixed $value The value to check.
-	 * @return bool True if `$value` is countable, false otherwise.
-	 */
-	function is_countable( $value ) {
-		return ( is_array( $value )
-			|| $value instanceof Countable
-			|| $value instanceof SimpleXMLElement
-			|| $value instanceof ResourceBundle
-		);
-	}
-}
-
-if ( ! function_exists( 'array_key_first' ) ) {
-	/**
-	 * Polyfill for array_key_first() function added in PHP 7.3.
-	 *
-	 * Get the first key of the given array without affecting
-	 * the internal array pointer.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @param array $array An array.
-	 * @return string|int|null The first key of array if the array
-	 *                         is not empty; `null` otherwise.
-	 */
-	function array_key_first( array $array ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound
-		if ( empty( $array ) ) {
-			return null;
-		}
-
-		foreach ( $array as $key => $value ) {
-			return $key;
-		}
-	}
-}
-
-if ( ! function_exists( 'array_key_last' ) ) {
-	/**
-	 * Polyfill for `array_key_last()` function added in PHP 7.3.
-	 *
-	 * Get the last key of the given array without affecting the
-	 * internal array pointer.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @param array $array An array.
-	 * @return string|int|null The last key of array if the array
-	 *.                        is not empty; `null` otherwise.
-	 */
-	function array_key_last( array $array ) { // phpcs:ignore Universal.NamingConventions.NoReservedKeywordParameterNames.arrayFound
-		if ( empty( $array ) ) {
-			return null;
-		}
-
-		end( $array );
-
-		return key( $array );
-	}
-}
-
 if ( ! function_exists( 'array_is_list' ) ) {
 	/**
 	 * Polyfill for `array_is_list()` function added in PHP 8.1.
diff --git a/wp-includes/css/dist/index.php b/wp-includes/css/dist/index.php
index abb9de2cf2..7e238db692 100644
--- a/wp-includes/css/dist/index.php
+++ b/wp-includes/css/dist/index.php
@@ -12,20 +12,15 @@ return array(
 		'path' => 'preferences/style',
 		'dependencies' => array('wp-components'),
 	),
-	array(
-		'handle' => 'wp-list-reusable-blocks',
-		'path' => 'list-reusable-blocks/style',
-		'dependencies' => array('wp-components'),
-	),
 	array(
 		'handle' => 'wp-nux',
 		'path' => 'nux/style',
 		'dependencies' => array('wp-components'),
 	),
 	array(
-		'handle' => 'wp-patterns',
-		'path' => 'patterns/style',
-		'dependencies' => array('wp-block-editor', 'wp-components'),
+		'handle' => 'wp-list-reusable-blocks',
+		'path' => 'list-reusable-blocks/style',
+		'dependencies' => array('wp-components'),
 	),
 	array(
 		'handle' => 'wp-reusable-blocks',
@@ -33,8 +28,8 @@ return array(
 		'dependencies' => array('wp-block-editor', 'wp-components'),
 	),
 	array(
-		'handle' => 'wp-widgets',
-		'path' => 'widgets/style',
+		'handle' => 'wp-patterns',
+		'path' => 'patterns/style',
 		'dependencies' => array('wp-block-editor', 'wp-components'),
 	),
 	array(
@@ -47,6 +42,11 @@ return array(
 		'path' => 'components/style',
 		'dependencies' => array(),
 	),
+	array(
+		'handle' => 'wp-widgets',
+		'path' => 'widgets/style',
+		'dependencies' => array('wp-block-editor', 'wp-components'),
+	),
 	array(
 		'handle' => 'wp-format-library',
 		'path' => 'format-library/style',
@@ -62,39 +62,39 @@ return array(
 		'path' => 'customize-widgets/style',
 		'dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-components', 'wp-media-utils', 'wp-preferences', 'wp-widgets'),
 	),
-	array(
-		'handle' => 'wp-edit-post',
-		'path' => 'edit-post/style',
-		'dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-commands', 'wp-components', 'wp-editor', 'wp-preferences', 'wp-widgets'),
-	),
 	array(
 		'handle' => 'wp-media-utils',
 		'path' => 'media-utils/style',
 		'dependencies' => array('wp-components'),
 	),
 	array(
-		'handle' => 'wp-block-library',
-		'path' => 'block-library/style',
-		'dependencies' => array('wp-block-editor', 'wp-components', 'wp-patterns'),
+		'handle' => 'wp-edit-post',
+		'path' => 'edit-post/style',
+		'dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-commands', 'wp-components', 'wp-editor', 'wp-preferences', 'wp-widgets'),
 	),
 	array(
 		'handle' => 'wp-edit-widgets',
 		'path' => 'edit-widgets/style',
 		'dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-components', 'wp-media-utils', 'wp-patterns', 'wp-preferences', 'wp-widgets'),
 	),
+	array(
+		'handle' => 'wp-block-library',
+		'path' => 'block-library/style',
+		'dependencies' => array('wp-block-editor', 'wp-components', 'wp-patterns'),
+	),
 	array(
 		'handle' => 'wp-editor',
 		'path' => 'editor/style',
 		'dependencies' => array('wp-block-editor', 'wp-commands', 'wp-components', 'wp-media-utils', 'wp-patterns', 'wp-preferences'),
 	),
-	array(
-		'handle' => 'wp-edit-site',
-		'path' => 'edit-site/style',
-		'dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-commands', 'wp-components', 'wp-editor', 'wp-patterns', 'wp-preferences', 'wp-widgets'),
-	),
 	array(
 		'handle' => 'wp-block-editor',
 		'path' => 'block-editor/style',
 		'dependencies' => array('wp-commands', 'wp-components', 'wp-preferences'),
 	),
+	array(
+		'handle' => 'wp-edit-site',
+		'path' => 'edit-site/style',
+		'dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-commands', 'wp-components', 'wp-editor', 'wp-patterns', 'wp-preferences', 'wp-widgets'),
+	),
 );
diff --git a/wp-includes/js/dist/script-modules/index.php b/wp-includes/js/dist/script-modules/index.php
index e7e9ca3b69..89dd1fa569 100644
--- a/wp-includes/js/dist/script-modules/index.php
+++ b/wp-includes/js/dist/script-modules/index.php
@@ -13,9 +13,14 @@ return array(
 		'asset' => 'core-abilities/index.min.asset.php',
 	),
 	array(
-		'id' => '@wordpress/a11y',
-		'path' => 'a11y/index',
-		'asset' => 'a11y/index.min.asset.php',
+		'id' => '@wordpress/interactivity-router',
+		'path' => 'interactivity-router/index',
+		'asset' => 'interactivity-router/index.min.asset.php',
+	),
+	array(
+		'id' => '@wordpress/interactivity-router/full-page',
+		'path' => 'interactivity-router/full-page',
+		'asset' => 'interactivity-router/full-page.min.asset.php',
 	),
 	array(
 		'id' => '@wordpress/interactivity',
@@ -23,14 +28,14 @@ return array(
 		'asset' => 'interactivity/index.min.asset.php',
 	),
 	array(
-		'id' => '@wordpress/interactivity-router',
-		'path' => 'interactivity-router/index',
-		'asset' => 'interactivity-router/index.min.asset.php',
+		'id' => '@wordpress/a11y',
+		'path' => 'a11y/index',
+		'asset' => 'a11y/index.min.asset.php',
 	),
 	array(
-		'id' => '@wordpress/interactivity-router/full-page',
-		'path' => 'interactivity-router/full-page',
-		'asset' => 'interactivity-router/full-page.min.asset.php',
+		'id' => '@wordpress/abilities',
+		'path' => 'abilities/index',
+		'asset' => 'abilities/index.min.asset.php',
 	),
 	array(
 		'id' => '@wordpress/latex-to-mathml',
@@ -42,11 +47,6 @@ return array(
 		'path' => 'latex-to-mathml/loader',
 		'asset' => 'latex-to-mathml/loader.min.asset.php',
 	),
-	array(
-		'id' => '@wordpress/abilities',
-		'path' => 'abilities/index',
-		'asset' => 'abilities/index.min.asset.php',
-	),
 	array(
 		'id' => '@wordpress/route',
 		'path' => 'route/index',
diff --git a/wp-includes/pluggable.php b/wp-includes/pluggable.php
index 4241a8f184..8cf983ead7 100644
--- a/wp-includes/pluggable.php
+++ b/wp-includes/pluggable.php
@@ -2777,11 +2777,10 @@ if ( ! function_exists( 'wp_hash_password' ) ) :
 		 * - `PASSWORD_ARGON2ID`
 		 * - `PASSWORD_DEFAULT`
 		 *
-		 * The values of the algorithm constants are strings in PHP 7.4+ and integers in PHP 7.3 and earlier.
-		 *
 		 * @since 6.8.0
+		 * @since 7.0.0 The `$algorithm` parameter is now always a string.
 		 *
-		 * @param string|int $algorithm The hashing algorithm. Default is the value of the `PASSWORD_BCRYPT` constant.
+		 * @param string $algorithm The hashing algorithm. Default is the value of the `PASSWORD_BCRYPT` constant.
 		 */
 		$algorithm = apply_filters( 'wp_hash_password_algorithm', PASSWORD_BCRYPT );

@@ -2791,14 +2790,13 @@ if ( ! function_exists( 'wp_hash_password' ) ) :
 		 * The default hashing algorithm is bcrypt, but this can be changed via the {@see 'wp_hash_password_algorithm'}
 		 * filter. You must ensure that the options are appropriate for the algorithm in use.
 		 *
-		 * The values of the algorithm constants are strings in PHP 7.4+ and integers in PHP 7.3 and earlier.
-		 *
 		 * @since 6.8.0
+		 * @since 7.0.0 The `$algorithm` parameter is now always a string.
 		 *
-		 * @param array      $options   Array of options to pass to the password hashing functions.
-		 *                              By default this is an empty array which means the default
-		 *                              options will be used.
-		 * @param string|int $algorithm The hashing algorithm in use.
+		 * @param array  $options   Array of options to pass to the password hashing functions.
+		 *                          By default this is an empty array which means the default
+		 *                          options will be used.
+		 * @param string $algorithm The hashing algorithm in use.
 		 */
 		$options = apply_filters( 'wp_hash_password_options', array(), $algorithm );

diff --git a/wp-includes/version.php b/wp-includes/version.php
index a08ed2659c..b1943f62e8 100644
--- a/wp-includes/version.php
+++ b/wp-includes/version.php
@@ -16,7 +16,7 @@
  *
  * @global string $wp_version
  */
-$wp_version = '7.0-alpha-61458';
+$wp_version = '7.0-alpha-61459';

 /**
  * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
@@ -37,7 +37,7 @@ $tinymce_version = '49110-20250317';
  *
  * @global string $required_php_version
  */
-$required_php_version = '7.2.24';
+$required_php_version = '7.4';

 /**
  * Holds the names of required PHP extensions.