diff --git a/wp-includes/plugin.php b/wp-includes/plugin.php index dd8798a074..bff15c1383 100644 --- a/wp-includes/plugin.php +++ b/wp-includes/plugin.php @@ -946,3 +946,65 @@ function _wp_filter_build_unique_id($tag, $function, $priority) { return $function[0] . '::' . $function[1]; } } + +/** + * Back up global variables used for actions and filters. + * + * Prevents redefinition of these globals in advanced-cache.php from accidentally + * destroying existing data. + * + * @since 4.6.0 + * @access private + * + * @global array $wp_filter Stores all filters and actions. + * @global array $wp_actions Stores the amount of times an action was triggered. + * @global array $merged_filters Merges the filter hooks using this function. + * @global array $wp_current_filter Stores the list of current filters with the current one last. + * @staticvar array $backup_globals Backed up globals. + * @return array the staticvar from the first time it is set. + */ +function _backup_plugin_globals(){ + global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; + static $backup_globals = array(); + if ( empty( $backup_globals ) ) { + $backup_globals = array( + 'backup_wp_filter' => $wp_filter, + 'backup_wp_actions' => $wp_actions, + 'backup_merged_filters' => $merged_filters, + 'backup_wp_current_filter' => $wp_current_filter, + ); + }; + return $backup_globals; +} + +/** + * Safely restore backed up global variables used for actions and filters. + * + * @since 4.6.0 + * @access private + * + * @global array $wp_filter Stores all filters and actions. + * @global array $wp_actions Stores the amount of times an action was triggered. + * @global array $merged_filters Merges the filter hooks using this function. + * @global array $wp_current_filter Stores the list of current filters with the current one last. + * @staticvar array $backup_globals Backed up globals. + */ +function _restore_plugin_globals(){ + global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; + $backup_globals = _backup_plugin_globals(); + if ( $wp_filter !== $backup_globals['backup_wp_filter'] ){ + $wp_filter = array_merge_recursive( $wp_filter, $backup_globals['backup_wp_filter'] ); + } + + if ( $wp_actions !== $backup_globals['backup_wp_actions'] ){ + $wp_actions = array_merge_recursive( $wp_actions, $backup_globals['backup_wp_actions'] ); + } + + if ( $merged_filters !== $backup_globals['backup_merged_filters'] ){ + $merged_filters = array_merge_recursive( $merged_filters, $backup_globals['backup_merged_filters'] ); + } + + if ( $wp_current_filter !== $backup_globals['backup_wp_current_filter'] ){ + $wp_current_filter = array_merge_recursive( $wp_current_filter, $backup_globals['backup_wp_current_filter'] ); + } +} diff --git a/wp-includes/version.php b/wp-includes/version.php index aba64d6d1d..147167953c 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.6-alpha-37587'; +$wp_version = '4.6-alpha-37588'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. diff --git a/wp-settings.php b/wp-settings.php index fb8cd22d42..8beee6fdb8 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -20,6 +20,7 @@ define( 'WPINC', 'wp-includes' ); // Include files required for initialization. require( ABSPATH . WPINC . '/load.php' ); require( ABSPATH . WPINC . '/default-constants.php' ); +require( ABSPATH . WPINC . '/plugin.php' ); /* * These can't be directly globalized in version.php. When updating, @@ -70,8 +71,11 @@ timer_start(); wp_debug_mode(); // For an advanced caching plugin to use. Uses a static drop-in because you would only want one. -if ( WP_CACHE ) +if ( WP_CACHE ) { + _backup_plugin_globals(); WP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' ); + _restore_plugin_globals(); +} // Define WP_LANG_DIR if not set. wp_set_lang_dir(); @@ -81,7 +85,6 @@ require( ABSPATH . WPINC . '/compat.php' ); require( ABSPATH . WPINC . '/functions.php' ); require( ABSPATH . WPINC . '/class-wp.php' ); require( ABSPATH . WPINC . '/class-wp-error.php' ); -require( ABSPATH . WPINC . '/plugin.php' ); require( ABSPATH . WPINC . '/pomo/mo.php' ); // Include the wpdb class and, if present, a db.php database drop-in.