WordPress.org

Make WordPress Core

Ticket #36819: 36819.8.diff

File 36819.8.diff, 6.4 KB (added by azaozz, 4 years ago)
  • src/wp-includes/plugin.php

     
    10011001                return $function[0] . '::' . $function[1];
    10021002        }
    10031003}
    1004 
    1005 /**
    1006  * Backs up global variables used for actions and filters.
    1007  *
    1008  * Prevents redefinition of these globals in advanced-cache.php from accidentally
    1009  * destroying existing data.
    1010  *
    1011  * @since 4.6.0
    1012  * @access private
    1013  *
    1014  * @global array $wp_filter         Stores all filters and actions.
    1015  * @global array $wp_actions        Stores the amount of times an action was triggered.
    1016  * @global array $merged_filters    Merges the filter hooks using this function.
    1017  * @global array $wp_current_filter Stores the list of current filters with the current one last.
    1018  * @staticvar array $backup_globals Backed up globals.
    1019  *
    1020  * @return array the staticvar from the first time it is set.
    1021  */
    1022 function _backup_plugin_globals( $backup = true ) {
    1023         global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
    1024 
    1025         static $backup_globals = array();
    1026 
    1027         if ( $backup ) {
    1028                 $backup_globals = array(
    1029                         'backup_wp_filter'         => $wp_filter,
    1030                         'backup_wp_actions'        => $wp_actions,
    1031                         'backup_merged_filters'    => $merged_filters,
    1032                         'backup_wp_current_filter' => $wp_current_filter,
    1033                 );
    1034 
    1035                 $wp_filter = $wp_actions = array();
    1036         }
    1037         return $backup_globals;
    1038 }
    1039 
    1040 /**
    1041  * Safely restores backed up global variables used for actions and filters.
    1042  *
    1043  * @since 4.6.0
    1044  * @access private
    1045  *
    1046  * @global array $wp_filter         Stores all filters and actions.
    1047  * @global array $wp_actions        Stores the amount of times an action was triggered.
    1048  * @global array $merged_filters    Merges the filter hooks using this function.
    1049  * @global array $wp_current_filter Stores the list of current filters with the current one last.
    1050  * @staticvar array $backup_globals Backed up globals.
    1051  */
    1052 function _restore_plugin_globals() {
    1053         global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
    1054 
    1055         $backup_globals = _backup_plugin_globals( false );
    1056 
    1057         if ( empty( $wp_filter ) ) {
    1058                 $wp_filter = $backup_globals['backup_wp_filter'];
    1059         } else {
    1060                 $added_filters = $wp_filter;
    1061                 $wp_filter = $backup_globals['backup_wp_filter'];
    1062 
    1063                 foreach ( $added_filters as $tag => $callback_groups ) {
    1064                         // Loop through callback groups.
    1065                         foreach ( $callback_groups as $priority => $callbacks ) {
    1066 
    1067                                 // Loop through callbacks.
    1068                                 foreach ( $callbacks as $cb ) {
    1069                                         add_filter( $tag, $cb['function'], $priority, $cb['accepted_args'] );
    1070                                 }
    1071                         }
    1072                 }
    1073         }
    1074 
    1075         if ( empty ( $wp_actions ) ) {
    1076                 $wp_actions = $backup_globals['backup_wp_actions'];
    1077         } else {
    1078                 $run_actions = $wp_actions;
    1079                 $wp_actions = $backup_globals['backup_wp_actions'];
    1080 
    1081                 foreach( $run_actions as $action => $count ) {
    1082                         if ( ! isset( $wp_actions[ $action ] ) ) {
    1083                                 $wp_actions[ $action ] = 0;
    1084                         }
    1085 
    1086                         $wp_actions[ $action ] += $count;
    1087                 }
    1088         }
    1089 
    1090         if ( $merged_filters !== $backup_globals['backup_merged_filters'] ) {
    1091                 $merged_filters = array_merge_recursive( $merged_filters, $backup_globals['backup_merged_filters'] );
    1092         }
    1093 
    1094         if ( $wp_current_filter !== $backup_globals['backup_wp_current_filter'] ) {
    1095                 $wp_current_filter = array_merge_recursive( $wp_current_filter, $backup_globals['backup_wp_current_filter'] );
    1096         }
    1097 }
  • src/wp-settings.php

     
    8383 */
    8484if ( WP_CACHE && apply_filters( 'enable_loading_advanced_cache_dropin', true ) ) {
    8585// For an advanced caching plugin to use. Uses a static drop-in because you would only want one.
    86         _backup_plugin_globals( true );
    8786        WP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' );
    88         _restore_plugin_globals();
    8987}
    9088
    9189// Define WP_LANG_DIR if not set.
  • tests/phpunit/tests/actions.php

     
    328328                $this->assertFalse( doing_filter( 'testing' ) ); // No longer doing this filter
    329329        }
    330330
    331         /**
    332          * @ticket 36819
    333          */
    334         function test_backup_plugin_globals_returns_filters() {
    335                 $backup = _backup_plugin_globals( true );
    336                 $this->assertArrayHasKey( 'backup_wp_filter',         $backup );
    337                 $this->assertArrayHasKey( 'backup_wp_actions',        $backup );
    338                 $this->assertArrayHasKey( 'backup_wp_current_filter', $backup );
    339                 $this->assertArrayHasKey( 'backup_merged_filters', $backup );
    340         }
    341 
    342         /**
    343          * @ticket 36819
    344          */
    345         function test_backup_plugin_globals_returns_filters_from_first_time_called() {
    346                 $backup = _backup_plugin_globals( true );
    347 
    348                 $a = new MockAction();
    349                 $tag = rand_str();
    350 
    351                 add_action($tag, array(&$a, 'action'));
    352 
    353                 $new_backup = _backup_plugin_globals( false );
    354                 $this->assertEquals( $backup, $new_backup );
    355         }
    356 
    357         /**
    358          * @ticket 36819
    359          */
    360         function test_restore_plugin_globals_from_stomp() {
    361                 global $wp_actions;
    362                 $original_actions = $wp_actions;
    363 
    364                 _backup_plugin_globals( true );
    365 
    366                 $wp_actions = array();
    367 
    368                 $this->assertEmpty( $wp_actions );
    369                 _restore_plugin_globals();
    370 
    371                 $this->assertEquals( $GLOBALS['wp_actions'], $original_actions );
    372         }
    373 
    374         /**
    375          * @ticket 36819
    376          */
    377         function test_restore_plugin_globals_includes_additions() {
    378                 global $wp_filter;
    379                 $original_filter = $wp_filter;
    380 
    381                 $backup = _backup_plugin_globals( true );
    382 
    383                 $a = new MockAction();
    384                 $tag = rand_str();
    385                 add_action($tag, array(&$a, 'action'));
    386 
    387                 $this->assertNotEquals( $GLOBALS['wp_filter'], $original_filter );
    388 
    389                 _restore_plugin_globals();
    390 
    391                 $this->assertNotEquals( $GLOBALS['wp_filter'], $original_filter );
    392         }
    393 
    394         /**
    395          * @ticket 36819
    396          */
    397         function test_applied_actions_are_counted_after_restore() {
    398                 global $wp_actions;
    399 
    400                 $action_name = 'this_is_a_fake_action_name';
    401                 $this->assertArrayNotHasKey( $action_name, $wp_actions );
    402 
    403                 do_action( $action_name );
    404 
    405                 $this->assertEquals( 1, $wp_actions[ $action_name ] );
    406 
    407                 _backup_plugin_globals( true );
    408                 do_action( $action_name );
    409                 _restore_plugin_globals();
    410 
    411                 $this->assertEquals( 2, $wp_actions[ $action_name ] );
    412         }
    413 
    414331        function apply_testing_filter() {
    415332                $this->apply_testing_filter = true;
    416333