Ticket #3875: plugin.php.diff

File plugin.php.diff, 5.3 kB (added by markjaquith, 2 years ago)

Previous file as a patch

  • plugin.php

    old new  
    77function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) { 
    88        global $wp_filter; 
    99 
    10         // check that we don't already have the same filter at the same priority 
    11         if ( isset($wp_filter[$tag]["$priority"]) ) { 
    12                 foreach ( $wp_filter[$tag]["$priority"] as $filter ) { 
    13                         // uncomment if we want to match function AND accepted_args 
    14                         // if ( $filter == array($function, $accepted_args) ) { 
    15                         if ( $filter['function'] == $function_to_add ) 
    16                                 return true; 
    17                 } 
    18         } 
    19  
    20         // So the format is wp_filter['tag']['array of priorities']['array of ['array (functions, accepted_args)]'] 
    21         $wp_filter[$tag]["$priority"][] = array('function'=>$function_to_add, 'accepted_args'=>$accepted_args); 
     10        // So the format is wp_filter['tag']['array of priorities']['array of functions serialized']['array of ['array (functions, accepted_args)]'] 
     11        $wp_filter[$tag][$priority][serialize($function_to_add)] = array('function' => $function_to_add, 'accepted_args' => $accepted_args); 
    2212        return true; 
    2313} 
    2414 
    2515function apply_filters($tag, $string) { 
    2616        global $wp_filter; 
    2717 
    28         $args = array(); 
    29         for ( $a = 2; $a < func_num_args(); $a++ ) 
    30                 $args[] = func_get_arg($a); 
    31  
    3218        merge_filters($tag); 
    3319 
    3420        if ( !isset($wp_filter[$tag]) ) 
    3521                return $string; 
    3622 
    37         foreach ( (array) $wp_filter[$tag] as $priority => $functions ) { 
    38                 if ( !is_null($functions) ) { 
    39                         foreach ( (array) $functions as $function ) { 
    40                                 $function_name = $function['function']; 
    41                                 $accepted_args = $function['accepted_args']; 
    42                                 $the_args = $args; 
    43                                 array_unshift($the_args, $string); 
    44                                 if ( $accepted_args > 0 ) 
    45                                         $the_args = array_slice($the_args, 0, $accepted_args); 
    46                                 elseif ( 0 == $accepted_args ) 
    47                                         $the_args = NULL; 
    48                                 $string = call_user_func_array($function_name, $the_args); 
     23        $args = func_get_args(); 
     24 
     25        do{ 
     26                foreach( (array) current($wp_filter[$tag]) as $the_ ) 
     27                        if ( !is_null($the_['function']) ){ 
     28                                $args[1] = $string; 
     29                                $string = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args'])); 
    4930                        } 
    50                 } 
    51         } 
     31 
     32        } while ( next($wp_filter[$tag]) ); 
     33 
    5234        return $string; 
    5335} 
    5436 
    5537function merge_filters($tag) { 
    5638        global $wp_filter; 
    57         if ( isset($wp_filter['all']) ) { 
    58                 foreach ( (array) $wp_filter['all'] as $priority => $functions ) { 
    59                         if ( isset($wp_filter[$tag][$priority]) ) 
    60                                 $wp_filter[$tag][$priority] = array_merge($wp_filter['all'][$priority], $wp_filter[$tag][$priority]); 
    61                         else 
    62                                 $wp_filter[$tag][$priority] = array_merge($wp_filter['all'][$priority], array()); 
    63                         $wp_filter[$tag][$priority] = array_unique($wp_filter[$tag][$priority]); 
    64                 } 
    65         } 
    6639 
    67         if ( isset($wp_filter[$tag]) ) 
    68                 uksort( $wp_filter[$tag], "strnatcasecmp" ); 
     40        if ( isset($wp_filter['all']) ) 
     41                $wp_filter[$tag] = array_merge($wp_filter['all'], (array) $wp_filter[$tag]); 
     42 
     43        if ( isset($wp_filter[$tag]) ){ 
     44                reset($wp_filter[$tag]); 
     45                uksort($wp_filter[$tag], "strnatcasecmp"); 
     46        } 
    6947} 
    7048 
    7149function remove_filter($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 
    7250        global $wp_filter; 
    7351 
    74         // rebuild the list of filters 
    75         if ( isset($wp_filter[$tag]["$priority"]) ) { 
    76                 $new_function_list = array(); 
    77                 foreach ( (array) $wp_filter[$tag]["$priority"] as $filter ) { 
    78                         if ( $filter['function'] != $function_to_remove ) 
    79                                 $new_function_list[] = $filter; 
    80                 } 
    81                 $wp_filter[$tag]["$priority"] = $new_function_list; 
    82         } 
     52        unset($GLOBALS['wp_filter'][$tag][$priority][serialize($function_to_remove)]); 
     53 
    8354        return true; 
    8455} 
    8556 
     
    10778        if ( !isset($wp_filter[$tag]) ) 
    10879                return; 
    10980 
    110         foreach ( (array) $wp_filter[$tag] as $priority => $functions ) { 
    111                 if ( !is_null($functions) ) { 
    112                         foreach ( (array) $functions as $function ) { 
    113                                 $function_name = $function['function']; 
    114                                 $accepted_args = $function['accepted_args']; 
     81        do{ 
     82                foreach( (array) current($wp_filter[$tag]) as $the_ ) 
     83                        if ( !is_null($the_['function']) ) 
     84                                call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args'])); 
    11585 
    116                                 if ( $accepted_args > 0 ) 
    117                                         $the_args = array_slice($args, 0, $accepted_args); 
    118                                 elseif ( $accepted_args == 0 ) 
    119                                         $the_args = NULL; 
    120                                 else 
    121                                         $the_args = $args; 
     86        } while ( next($wp_filter[$tag]) ); 
    12287 
    123                                 call_user_func_array($function_name, $the_args); 
    124                         } 
    125                 } 
    126         } 
    127  
    12888        if ( is_array($wp_actions) ) 
    12989                $wp_actions[] = $tag; 
    13090        else 
     
    151111        if ( !isset($wp_filter[$tag]) ) 
    152112                return; 
    153113 
    154         foreach ( (array) $wp_filter[$tag] as $priority => $functions ) { 
    155                 if ( !is_null($functions) ) { 
    156                         foreach ( (array) $functions as $function ) { 
    157                                 $function_name = $function['function']; 
    158                                 $accepted_args = $function['accepted_args']; 
    159                                 if ( $accepted_args > 0 ) 
    160                                         $the_args = array_slice($args, 0, $accepted_args); 
    161                                 elseif ( 0 == $accepted_args ) 
    162                                         $the_args = NULL; 
    163                                 else 
    164                                         $the_args = $args; 
     114        do{ 
     115                foreach( (array) current($wp_filter[$tag]) as $the_ ) 
     116                        if ( !is_null($the_['function']) ) 
     117                                call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args'])); 
    165118 
    166                                 call_user_func_array($function_name, $the_args); 
    167                         } 
    168                 } 
    169         } 
     119        } while ( next($wp_filter[$tag]) ); 
     120 
    170121} 
    171122 
    172123function remove_action($tag, $function_to_remove, $priority = 10, $accepted_args = 1) {