From d7c132b829f4a0575bbd1dff1acc6fbbb519dd37 Mon Sep 17 00:00:00 2001 From: Colin Stewart Date: Mon, 12 Feb 2024 12:31:29 +0000 Subject: [PATCH] Upgrade/Install: Avoid `update_option()` calls during bootstrap. [57545] introduced the Plugin Dependencies feature, which contains a new `plugin_data` option. Previously, the `plugin_data` option was being updated during bootstrap and in `get_plugins()`, causing an error when using the install script as the options database table does not yet exist, and also risked an "out of sync" issue between the database and the cache on websites with heavy traffic. This removes the calls to `update_option()` during Core's bootstrap, and guards the call in `get_plugins()` to ensure that it doesn't run when WordPress is installing. Follow-up to [57545]. Props desrosj, swisspidy, huzaifaalmesbah, afragen, dd32, azaozz, costdev. Fixes #60461. See #60457, #60491. git-svn-id: https://develop.svn.wordpress.org/trunk@57592 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/plugin.php | 5 +++- src/wp-includes/load.php | 15 ------------ src/wp-settings.php | 42 ++++++++------------------------ 3 files changed, 14 insertions(+), 48 deletions(-) diff --git a/src/wp-admin/includes/plugin.php b/src/wp-admin/includes/plugin.php index 54a5b95f34..af5f085b2e 100644 --- a/src/wp-admin/includes/plugin.php +++ b/src/wp-admin/includes/plugin.php @@ -360,7 +360,10 @@ function get_plugins( $plugin_folder = '' ) { $cache_plugins[ $plugin_folder ] = $wp_plugins; wp_cache_set( 'plugins', $cache_plugins, 'plugins' ); - update_option( 'plugin_data', $new_plugin_data ); + + if ( ! wp_installing() ) { + update_option( 'plugin_data', $new_plugin_data ); + } return $wp_plugins; } diff --git a/src/wp-includes/load.php b/src/wp-includes/load.php index 78961bccec..c188598768 100644 --- a/src/wp-includes/load.php +++ b/src/wp-includes/load.php @@ -986,7 +986,6 @@ function wp_get_active_and_valid_plugins() { $network_plugins = is_multisite() ? wp_get_active_network_plugins() : false; - $invalid_plugins = array(); foreach ( $active_plugins as $plugin ) { if ( ! validate_file( $plugin ) // $plugin must validate as file. && str_ends_with( $plugin, '.php' ) // $plugin must end with '.php'. @@ -995,20 +994,6 @@ function wp_get_active_and_valid_plugins() { && ( ! $network_plugins || ! in_array( WP_PLUGIN_DIR . '/' . $plugin, $network_plugins, true ) ) ) { $plugins[] = WP_PLUGIN_DIR . '/' . $plugin; - } else { - $invalid_plugins[] = $plugin; - } - } - - if ( ! empty( $invalid_plugins ) ) { - $all_plugin_data = get_option( 'plugin_data', array() ); - - if ( ! empty( $all_plugin_data ) ) { - foreach ( $invalid_plugins as $invalid_plugin ) { - unset( $all_plugin_data[ $invalid_plugin ] ); - } - - update_option( 'plugin_data', $all_plugin_data ); } } diff --git a/src/wp-settings.php b/src/wp-settings.php index 373408b620..3e01b7df4d 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -499,28 +499,18 @@ if ( ! is_multisite() && wp_is_fatal_error_handler_enabled() ) { } // Load active plugins. -$all_plugin_data = get_option( 'plugin_data', array() ); -$failed_plugins = array(); -$update_plugin_data = false; +$all_plugin_data = get_option( 'plugin_data', array() ); +$failed_plugins = array(); foreach ( wp_get_active_and_valid_plugins() as $plugin ) { - $plugin_file = str_replace( trailingslashit( WP_PLUGIN_DIR ), '', $plugin ); - if ( ! isset( $all_plugin_data[ $plugin_file ] ) ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - $all_plugin_data[ $plugin_file ] = get_plugin_data( WP_PLUGIN_DIR . "/$plugin_file" ); - - $update_plugin_data = true; - } - - $plugin_headers = $all_plugin_data[ $plugin_file ]; - $errors = array(); - $requirements = array( - 'requires' => ! empty( $plugin_headers['RequiresWP'] ) ? $plugin_headers['RequiresWP'] : '', - 'requires_php' => ! empty( $plugin_headers['RequiresPHP'] ) ? $plugin_headers['RequiresPHP'] : '', - 'requires_plugins' => ! empty( $plugin_headers['RequiresPlugins'] ) ? $plugin_headers['RequiresPlugins'] : '', + $plugin_file = str_replace( trailingslashit( WP_PLUGIN_DIR ), '', $plugin ); + $plugin_headers = $all_plugin_data[ $plugin_file ]; + $errors = array(); + $requirements = array( + 'requires' => ! empty( $plugin_headers['RequiresWP'] ) ? $plugin_headers['RequiresWP'] : '', + 'requires_php' => ! empty( $plugin_headers['RequiresPHP'] ) ? $plugin_headers['RequiresPHP'] : '', ); - $compatible_wp = is_wp_version_compatible( $requirements['requires'] ); - $compatible_php = is_php_version_compatible( $requirements['requires_php'] ); - $dependencies_met = ! WP_Plugin_Dependencies::has_unmet_dependencies( $plugin_file ); + $compatible_wp = is_wp_version_compatible( $requirements['requires'] ); + $compatible_php = is_php_version_compatible( $requirements['requires_php'] ); $php_update_message = '

' . sprintf( /* translators: %s: URL to Update PHP page. */ @@ -534,14 +524,6 @@ foreach ( wp_get_active_and_valid_plugins() as $plugin ) { $php_update_message .= '

' . $annotation . ''; } - if ( ! $dependencies_met ) { - $errors[] = sprintf( - /* translators: %s: The plugin's name. */ - _x( '%s has unmet dependencies.', 'plugin' ), - $plugin_headers['Name'] - ); - } - if ( ! $compatible_wp && ! $compatible_php ) { $errors[] = sprintf( /* translators: 1: Current WordPress version, 2: Current PHP version, 3: Plugin name, 4: Required WordPress version, 5: Required PHP version. */ @@ -601,10 +583,6 @@ foreach ( wp_get_active_and_valid_plugins() as $plugin ) { } unset( $plugin, $_wp_plugin_file ); -if ( $update_plugin_data ) { - update_option( 'plugin_data', $all_plugin_data ); -} - if ( ! empty( $failed_plugins ) ) { add_action( 'admin_notices',