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
This commit is contained in:
Colin Stewart 2024-02-12 12:31:29 +00:00
parent 876bfaf3e0
commit d7c132b829
3 changed files with 14 additions and 48 deletions

View File

@ -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;
}

View File

@ -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 );
}
}

View File

@ -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 = '</p><p>' . sprintf(
/* translators: %s: URL to Update PHP page. */
@ -534,14 +524,6 @@ foreach ( wp_get_active_and_valid_plugins() as $plugin ) {
$php_update_message .= '</p><p><em>' . $annotation . '</em>';
}
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',