From 4ac3feaa64ecc5651873738d0976ff21bb1ae241 Mon Sep 17 00:00:00 2001 From: Gary Pendergast Date: Tue, 9 Aug 2016 01:45:29 +0000 Subject: [PATCH] Boostrap/Load: Improve forward compatiblity of plugin global backup methods. [37588] added methods to backup the plugin globals, for ensuring that advanced cache drop-ins don't overwrite hooks that've been added earlier in the load process. The method for restoring the plugin globals wasn't compatible with the implementation of `WP_Hook` in #17817. `WP_Hook` implements `ArrayAccess`, so `_restore_plugin_globals()` was treating it as an array, and inadvertantly overwriting the `WP_Hook` object with a plain array. To avoid having to re-write this code as part of #17817, we now use `add_filter()` to restore any hooks that were added by cache drop-ins, which `WP_Hook` correctly supports. Props pento, jorbin. See #36819. Built from https://develop.svn.wordpress.org/trunk@38223 git-svn-id: http://core.svn.wordpress.org/trunk@38164 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/plugin.php | 49 ++++++++++++++++++++++++++++++++--------- wp-includes/version.php | 2 +- wp-settings.php | 2 +- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/wp-includes/plugin.php b/wp-includes/plugin.php index 479990a653..6e3a21e0a3 100644 --- a/wp-includes/plugin.php +++ b/wp-includes/plugin.php @@ -1019,19 +1019,21 @@ function _wp_filter_build_unique_id($tag, $function, $priority) { * * @return array the staticvar from the first time it is set. */ -function _backup_plugin_globals(){ +function _backup_plugin_globals( $backup = true ) { global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; static $backup_globals = array(); - if ( empty( $backup_globals ) ) { + if ( $backup ) { $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, ); - }; + + $wp_filter = $wp_actions = array(); + } return $backup_globals; } @@ -1047,24 +1049,49 @@ function _backup_plugin_globals(){ * @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(){ +function _restore_plugin_globals() { global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; - $backup_globals = _backup_plugin_globals(); + $backup_globals = _backup_plugin_globals( false ); - if ( $wp_filter !== $backup_globals['backup_wp_filter'] ){ - $wp_filter = array_merge_recursive( $wp_filter, $backup_globals['backup_wp_filter'] ); + if ( empty( $wp_filter ) ) { + $wp_filter = $backup_globals['backup_wp_filter']; + } else { + $added_filters = $wp_filter; + $wp_filter = $backup_globals['backup_wp_filter']; + + foreach ( $added_filters as $tag => $callback_groups ) { + // Loop through callback groups. + foreach ( $callback_groups as $priority => $callbacks ) { + + // Loop through callbacks. + foreach ( $callbacks as $cb ) { + add_filter( $tag, $cb['function'], $priority, $cb['accepted_args'] ); + } + } + } } - if ( $wp_actions !== $backup_globals['backup_wp_actions'] ){ - $wp_actions = array_merge_recursive( $wp_actions, $backup_globals['backup_wp_actions'] ); + if ( empty ( $wp_actions ) ) { + $wp_actions = $backup_globals['backup_wp_actions']; + } else { + $run_actions = $wp_actions; + $wp_actions = $backup_globals['backup_wp_actions']; + + foreach( $run_actions as $action => $count ) { + if ( ! isset( $wp_actions[ $action ] ) ) { + $wp_actions[ $action ] = 0; + } + + $wp_actions[ $action ] += $count; + } } - if ( $merged_filters !== $backup_globals['backup_merged_filters'] ){ + 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'] ){ + 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 5eaf81a345..ad7113f04a 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.7-alpha-38221'; +$wp_version = '4.7-alpha-38223'; /** * 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 37a31c2fe7..1a241fac05 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -83,7 +83,7 @@ wp_debug_mode(); */ if ( WP_CACHE && apply_filters( 'enable_loading_advanced_cache_dropin', true ) ) { // For an advanced caching plugin to use. Uses a static drop-in because you would only want one. - _backup_plugin_globals(); + _backup_plugin_globals( true ); WP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' ); _restore_plugin_globals(); }