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.

Merge of [38223] with the 4.6 branch.

Props pento, jorbin.
Fixes #36819.


Built from https://develop.svn.wordpress.org/branches/4.6@38224


git-svn-id: http://core.svn.wordpress.org/branches/4.6@38165 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Gary Pendergast 2016-08-09 01:51:29 +00:00
parent c63e673361
commit 1bbe957cc3
3 changed files with 40 additions and 13 deletions

View File

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

View File

@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.6-RC1-38222';
$wp_version = '4.6-RC1-38224';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.

View File

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