diff --git a/wp-admin/includes/admin-filters.php b/wp-admin/includes/admin-filters.php index 7b491c36b7..d03881c8ac 100644 --- a/wp-admin/includes/admin-filters.php +++ b/wp-admin/includes/admin-filters.php @@ -114,6 +114,7 @@ add_action( 'load-plugins.php', 'wp_plugin_update_rows', 20 ); // After wp_updat add_action( 'load-themes.php', 'wp_theme_update_rows', 20 ); // After wp_update_themes() is called. add_action( 'admin_notices', 'update_nag', 3 ); +add_action( 'admin_notices', 'deactivated_plugins_notice', 5 ); add_action( 'admin_notices', 'paused_plugins_notice', 5 ); add_action( 'admin_notices', 'paused_themes_notice', 5 ); add_action( 'admin_notices', 'maintenance_nag', 10 ); diff --git a/wp-admin/includes/plugin.php b/wp-admin/includes/plugin.php index 2b77846f8b..6e332c247e 100644 --- a/wp-admin/includes/plugin.php +++ b/wp-admin/includes/plugin.php @@ -2473,3 +2473,88 @@ function paused_plugins_notice() { __( 'Go to the Plugins screen' ) ); } + +/** + * Renders an admin notice when a plugin was deactivated during an update. + * + * Displays an admin notice in case a plugin has been deactivated during an + * upgrade due to incompatibility with the current version of WordPress. + * + * @since 5.8.0 + * @access private + * + * @global string $pagenow + * @global string $wp_version + */ +function deactivated_plugins_notice() { + if ( 'plugins.php' === $GLOBALS['pagenow'] ) { + return; + } + + if ( ! current_user_can( 'activate_plugins' ) ) { + return; + } + + $blog_deactivated_plugins = get_option( 'wp_force_deactivated_plugins' ); + $site_deactivated_plugins = array(); + + if ( false === $blog_deactivated_plugins ) { + // Option not in database, add an empty array to avoid extra DB queries on subsequent loads. + update_option( 'wp_force_deactivated_plugins', array() ); + } + + if ( is_multisite() ) { + $site_deactivated_plugins = get_site_option( 'wp_force_deactivated_plugins' ); + if ( false === $site_deactivated_plugins ) { + // Option not in database, add an empty array to avoid extra DB queries on subsequent loads. + update_site_option( 'wp_force_deactivated_plugins', array() ); + } + } + + if ( empty( $blog_deactivated_plugins ) && empty( $site_deactivated_plugins ) ) { + // No deactivated plugins. + return; + } + + $deactivated_plugins = array_merge( $blog_deactivated_plugins, $site_deactivated_plugins ); + + foreach ( $deactivated_plugins as $plugin ) { + if ( ! empty( $plugin['version_compatible'] ) && ! empty( $plugin['version_deactivated'] ) ) { + $explanation = sprintf( + /* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version, 4: Compatible plugin version */ + __( '%1$s %2$s was deactivated due to incompatibility with WordPress %3$s, please upgrade to %1$s %4$s or later.' ), + $plugin['plugin_name'], + $plugin['version_deactivated'], + $GLOBALS['wp_version'], + $plugin['version_compatible'] + ); + } else { + $explanation = sprintf( + /* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version */ + __( '%1$s %2$s was deactivated due to incompatibility with WordPress %3$s.' ), + $plugin['plugin_name'], + ! empty( $plugin['version_deactivated'] ) ? $plugin['version_deactivated'] : '', + $GLOBALS['wp_version'], + $plugin['version_compatible'] + ); + } + + printf( + '

%s
%s

%s

', + sprintf( + /* translators: %s: Name of deactivated plugin */ + __( '%s plugin deactivated during WordPress upgrade.' ), + $plugin['plugin_name'] + ), + $explanation, + esc_url( admin_url( 'plugins.php?plugin_status=inactive' ) ), + __( 'Go to the Plugins screen' ) + ); + } + + // Empty the options. + update_option( 'wp_force_deactivated_plugins', array() ); + if ( is_multisite() ) { + update_site_option( 'wp_force_deactivated_plugins', array() ); + } +} diff --git a/wp-admin/includes/schema.php b/wp-admin/includes/schema.php index 6f528f2288..8b1e56f3af 100644 --- a/wp-admin/includes/schema.php +++ b/wp-admin/includes/schema.php @@ -542,6 +542,9 @@ function populate_options( array $options = array() ) { // Default to enabled for new installs. // See https://core.trac.wordpress.org/ticket/51742. 'auto_update_core_major' => 'enabled', + + // 5.8.0 + 'wp_force_deactivated_plugins' => array(), ); // 3.3.0 diff --git a/wp-admin/includes/update-core.php b/wp-admin/includes/update-core.php index 32c70a19f0..8e83c4a4ce 100644 --- a/wp-admin/includes/update-core.php +++ b/wp-admin/includes/update-core.php @@ -1672,6 +1672,20 @@ function _upgrade_440_force_deactivate_incompatible_plugins() { */ function _upgrade_580_force_deactivate_incompatible_plugins() { if ( defined( 'GUTENBERG_VERSION' ) && version_compare( GUTENBERG_VERSION, '10.7', '<=' ) ) { + $deactivated_gutenberg['gutenberg'] = array( + 'plugin_name' => 'Gutenberg', + 'version_deactivated' => GUTENBERG_VERSION, + 'version_compatible' => '10.8', + ); + if ( is_plugin_active_for_network( 'gutenberg/gutenberg.php' ) ) { + $deactivated_plugins = get_site_option( 'wp_force_deactivated_plugins', array() ); + $deactivated_plugins = array_merge( $deactivated_plugins, $deactivated_gutenberg ); + update_site_option( 'wp_force_deactivated_plugins', $deactivated_plugins ); + } 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 ); + } deactivate_plugins( array( 'gutenberg/gutenberg.php' ), true ); } } diff --git a/wp-includes/version.php b/wp-includes/version.php index 4fbc390735..bb172dc5b8 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.8-beta4-51265'; +$wp_version = '5.8-beta4-51266'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.