diff -r 48c4eec2b7e6 -r 8c2e4d02f4ef wp/wp-admin/includes/update-core.php --- a/wp/wp-admin/includes/update-core.php Fri Sep 05 18:40:08 2025 +0200 +++ b/wp/wp-admin/includes/update-core.php Fri Sep 05 18:52:52 2025 +0200 @@ -2,6 +2,10 @@ /** * WordPress core upgrade functionality. * + * Note: Newly introduced functions and methods cannot be used here. + * All functions must be present in the previous version being upgraded from + * as this file is used there too. + * * @package WordPress * @subpackage Administration * @since 2.7.0 @@ -14,8 +18,8 @@ * * @since 2.7.0 * - * @global array $_old_files - * @var array + * @global string[] $_old_files + * @var string[] * @name $_old_files */ global $_old_files; @@ -737,10 +741,14 @@ 'wp-includes/blocks/query-title/editor.min.css', 'wp-includes/blocks/query-title/editor-rtl.css', 'wp-includes/blocks/query-title/editor-rtl.min.css', - 'wp-includes/blocks/tag-cloud/editor.css', - 'wp-includes/blocks/tag-cloud/editor.min.css', - 'wp-includes/blocks/tag-cloud/editor-rtl.css', - 'wp-includes/blocks/tag-cloud/editor-rtl.min.css', + /* + * Restored in WordPress 6.7 + * + * 'wp-includes/blocks/tag-cloud/editor.css', + * 'wp-includes/blocks/tag-cloud/editor.min.css', + * 'wp-includes/blocks/tag-cloud/editor-rtl.css', + * 'wp-includes/blocks/tag-cloud/editor-rtl.min.css', + */ // 6.1 'wp-includes/blocks/post-comments.php', 'wp-includes/blocks/post-comments', @@ -770,6 +778,69 @@ 'wp-includes/blocks/block/editor.min.css', 'wp-includes/blocks/block/editor-rtl.css', 'wp-includes/blocks/block/editor-rtl.min.css', + /* + * 6.7 + * + * WordPress 6.7 included a SimplePie upgrade that included a major + * refactoring of the file structure and library. The old files are + * split in to two sections to account for this: files and directories. + * + * See https://core.trac.wordpress.org/changeset/59141 + */ + // 6.7 - files + 'wp-includes/js/dist/interactivity-router.asset.php', + 'wp-includes/js/dist/interactivity-router.js', + 'wp-includes/js/dist/interactivity-router.min.js', + 'wp-includes/js/dist/interactivity-router.min.asset.php', + 'wp-includes/js/dist/interactivity.js', + 'wp-includes/js/dist/interactivity.min.js', + 'wp-includes/js/dist/vendor/react-dom.min.js.LICENSE.txt', + 'wp-includes/js/dist/vendor/react.min.js.LICENSE.txt', + 'wp-includes/js/dist/vendor/wp-polyfill-importmap.js', + 'wp-includes/js/dist/vendor/wp-polyfill-importmap.min.js', + 'wp-includes/sodium_compat/src/Core/Base64/Common.php', + 'wp-includes/SimplePie/Author.php', + 'wp-includes/SimplePie/Cache.php', + 'wp-includes/SimplePie/Caption.php', + 'wp-includes/SimplePie/Category.php', + 'wp-includes/SimplePie/Copyright.php', + 'wp-includes/SimplePie/Core.php', + 'wp-includes/SimplePie/Credit.php', + 'wp-includes/SimplePie/Enclosure.php', + 'wp-includes/SimplePie/Exception.php', + 'wp-includes/SimplePie/File.php', + 'wp-includes/SimplePie/gzdecode.php', + 'wp-includes/SimplePie/IRI.php', + 'wp-includes/SimplePie/Item.php', + 'wp-includes/SimplePie/Locator.php', + 'wp-includes/SimplePie/Misc.php', + 'wp-includes/SimplePie/Parser.php', + 'wp-includes/SimplePie/Rating.php', + 'wp-includes/SimplePie/Registry.php', + 'wp-includes/SimplePie/Restriction.php', + 'wp-includes/SimplePie/Sanitize.php', + 'wp-includes/SimplePie/Source.php', + // 6.7 - directories + 'wp-includes/SimplePie/Cache/', + 'wp-includes/SimplePie/Content/', + 'wp-includes/SimplePie/Decode/', + 'wp-includes/SimplePie/HTTP/', + 'wp-includes/SimplePie/Net/', + 'wp-includes/SimplePie/Parse/', + 'wp-includes/SimplePie/XML/', + // 6.8 + 'wp-includes/blocks/post-content/editor.css', + 'wp-includes/blocks/post-content/editor.min.css', + 'wp-includes/blocks/post-content/editor-rtl.css', + 'wp-includes/blocks/post-content/editor-rtl.min.css', + 'wp-includes/blocks/post-template/editor.css', + 'wp-includes/blocks/post-template/editor.min.css', + 'wp-includes/blocks/post-template/editor-rtl.css', + 'wp-includes/blocks/post-template/editor-rtl.min.css', + 'wp-includes/js/dist/undo-manager.js', + 'wp-includes/js/dist/undo-manager.min.js', + 'wp-includes/js/dist/fields.min.js', + 'wp-includes/js/dist/fields.js', ); /** @@ -782,8 +853,8 @@ * * @since 6.2.0 * - * @global array $_old_requests_files - * @var array + * @global string[] $_old_requests_files + * @var string[] * @name $_old_requests_files */ global $_old_requests_files; @@ -879,8 +950,8 @@ * upgrade. New themes are now installed again. To disable new * themes from being installed on upgrade, explicitly define * CORE_UPGRADE_SKIP_NEW_BUNDLED as true. - * @global array $_new_bundled_files - * @var array + * @global string[] $_new_bundled_files + * @var string[] * @name $_new_bundled_files */ global $_new_bundled_files; @@ -901,6 +972,7 @@ 'themes/twentytwentytwo/' => '5.9', 'themes/twentytwentythree/' => '6.1', 'themes/twentytwentyfour/' => '6.4', + 'themes/twentytwentyfive/' => '6.7', ); /** @@ -918,13 +990,14 @@ * * The steps for the upgrader for after the new release is downloaded and * unzipped is: + * * 1. Test unzipped location for select files to ensure that unzipped worked. * 2. Create the .maintenance file in current WordPress base. * 3. Copy new WordPress directory over old WordPress files. * 4. Upgrade WordPress to new version. - * 4.1. Copy all files/folders other than wp-content - * 4.2. Copy any language files to WP_LANG_DIR (which may differ from WP_CONTENT_DIR - * 4.3. Copy any new bundled themes/plugins to their respective locations + * 1. Copy all files/folders other than wp-content + * 2. Copy any language files to `WP_LANG_DIR` (which may differ from `WP_CONTENT_DIR` + * 3. Copy any new bundled themes/plugins to their respective locations * 5. Delete new WordPress directory path. * 6. Delete .maintenance file. * 7. Remove old files. @@ -946,13 +1019,10 @@ * @since 2.7.0 * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. - * @global array $_old_files - * @global array $_old_requests_files - * @global array $_new_bundled_files + * @global string[] $_old_files + * @global string[] $_old_requests_files + * @global string[] $_new_bundled_files * @global wpdb $wpdb WordPress database abstraction object. - * @global string $wp_version - * @global string $required_php_version - * @global string $required_mysql_version * * @param string $from New release unzipped path. * @param string $to Path to old WordPress installation. @@ -961,6 +1031,10 @@ function update_core( $from, $to ) { global $wp_filesystem, $_old_files, $_old_requests_files, $_new_bundled_files, $wpdb; + /* + * Give core update script an additional 300 seconds (5 minutes) + * to finish updating large files when running on slower servers. + */ if ( function_exists( 'set_time_limit' ) ) { set_time_limit( 300 ); } @@ -1012,7 +1086,7 @@ } /* - * Import $wp_version, $required_php_version, and $required_mysql_version from the new version. + * Import $wp_version, $required_php_version, $required_php_extensions, and $required_mysql_version from the new version. * DO NOT globalize any variables imported from `version-current.php` in this function. * * BC Note: $wp_filesystem->wp_content_dir() returned unslashed pre-2.8. @@ -1118,17 +1192,29 @@ ); } - // Add a warning when the JSON PHP extension is missing. - if ( ! extension_loaded( 'json' ) ) { - return new WP_Error( - 'php_not_compatible_json', - sprintf( - /* translators: 1: WordPress version number, 2: The PHP extension name needed. */ - __( 'The update cannot be installed because WordPress %1$s requires the %2$s PHP extension.' ), - $wp_version, - 'JSON' - ) - ); + if ( isset( $required_php_extensions ) && is_array( $required_php_extensions ) ) { + $missing_extensions = new WP_Error(); + + foreach ( $required_php_extensions as $extension ) { + if ( extension_loaded( $extension ) ) { + continue; + } + + $missing_extensions->add( + "php_not_compatible_{$extension}", + sprintf( + /* translators: 1: WordPress version number, 2: The PHP extension name needed. */ + __( 'The update cannot be installed because WordPress %1$s requires the %2$s PHP extension.' ), + $wp_version, + $extension + ) + ); + } + + // Add a warning when required PHP extensions are missing. + if ( ! empty( $missing_extensions->errors ) ) { + return $missing_extensions; + } } /** This filter is documented in wp-admin/includes/update-core.php */ @@ -1531,7 +1617,7 @@ * * @since 6.2.0 * - * @global array $_old_requests_files Requests files to be preloaded. + * @global string[] $_old_requests_files Requests files to be preloaded. * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * @global string $wp_version The WordPress version string. * @@ -1643,7 +1729,7 @@ * * @since 4.2.2 * - * @global array $wp_theme_directories + * @global string[] $wp_theme_directories * @global WP_Filesystem_Base $wp_filesystem */ function _upgrade_422_remove_genericons() { @@ -1689,7 +1775,7 @@ * @since 4.2.2 * * @param string $directory Directory path. Expects trailingslashed. - * @return array + * @return string[] */ function _upgrade_422_find_genericons_files_in_folder( $directory ) { $directory = trailingslashit( $directory ); @@ -1763,7 +1849,7 @@ } else { $deactivated_plugins = get_option( 'wp_force_deactivated_plugins', array() ); $deactivated_plugins = array_merge( $deactivated_plugins, $deactivated_gutenberg ); - update_option( 'wp_force_deactivated_plugins', $deactivated_plugins ); + update_option( 'wp_force_deactivated_plugins', $deactivated_plugins, false ); } deactivate_plugins( array( 'gutenberg/gutenberg.php' ), true ); }