WordPress.org

Make WordPress Core

Ticket #901: functionsdotphp-svn2365.patch

File functionsdotphp-svn2365.patch, 5.8 KB (added by michel v, 10 years ago)
  • trunk/wp-includes/functions.php

     
    871871function apply_filters($tag, $string) { 
    872872        global $wp_filter; 
    873873         
    874         $args = array_slice(func_get_args(), 3); 
     874        $args = array_slice(func_get_args(), 2); 
    875875 
    876876        merge_filters($tag); 
    877877         
    878         if (isset($wp_filter[$tag])) { 
    879                 foreach ($wp_filter[$tag] as $priority => $functions) { 
    880                         if (!is_null($functions)) { 
    881                                 foreach($functions as $function) { 
    882                                         $string = call_user_func_array($function, array($string) + $args); 
     878        if (!isset($wp_filter[$tag])) { 
     879                return $string; 
     880        } 
     881        foreach ($wp_filter[$tag] as $priority => $functions) { 
     882                if (!is_null($functions)) { 
     883                        foreach($functions as $function) { 
     884 
     885                                $all_args = array_merge(array($string), $args); 
     886                                $function_name = $function['function']; 
     887                                $accepted_args = $function['accepted_args']; 
     888 
     889                                if($accepted_args == 1) { 
     890                                        $args = array($string); 
     891                                } elseif ($accepted_args > 1) { 
     892                                        $args = array_slice($all_args, 0, $accepted_args); 
     893                                } elseif($accepted_args == 0) { 
     894                                        $args = NULL; 
     895                                } else { 
     896                                        $args = $all_args; 
    883897                                } 
     898 
     899                                $string = call_user_func_array($function_name, $args); 
    884900                        } 
    885901                } 
    886902        } 
    887903        return $string; 
    888904} 
    889905 
    890 function add_filter($tag, $function_to_add, $priority = 10) { 
     906function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) { 
    891907        global $wp_filter; 
    892         // So the format is wp_filter['tag']['array of priorities']['array of functions'] 
    893         if (!@in_array($function_to_add, $wp_filter[$tag]["$priority"])) { 
    894                 $wp_filter[$tag]["$priority"][] = $function_to_add; 
     908 
     909        list($function_to_add, $accepted_args) = _parse_incoming_filter($function_to_add, $accepted_args); 
     910 
     911        // check that we don't already have the same filter at the same priority 
     912        if (isset($wp_filter[$tag]["$priority"])) { 
     913                foreach($wp_filter[$tag]["$priority"] as $filter) { 
     914                        // uncomment if we want to match function AND accepted_args 
     915                        //if ($filter == array($function, $accepted_args)) { 
     916                        if ($filter['function'] == $function_to_add) { 
     917                                return true; 
     918                        } 
     919                } 
    895920        } 
     921 
     922        // So the format is wp_filter['tag']['array of priorities']['array of ['array (functions, accepted_args)]'] 
     923        $wp_filter[$tag]["$priority"][] = array('function'=>$function_to_add, 'accepted_args'=>$accepted_args); 
    896924        return true; 
    897925} 
    898926 
    899 function remove_filter($tag, $function_to_remove, $priority = 10) { 
     927function remove_filter($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 
    900928        global $wp_filter; 
    901         if (@in_array($function_to_remove, $wp_filter[$tag]["$priority"])) { 
    902                 foreach ($wp_filter[$tag]["$priority"] as $function) { 
    903                         if ($function_to_remove != $function) { 
    904                                 $new_function_list[] = $function; 
     929 
     930        list($function_to_remove, $accepted_args) = _parse_incoming_filter($function_to_remove, $accepted_args); 
     931 
     932        // rebuild the list of filters 
     933        if (isset($wp_filter[$tag]["$priority"])) { 
     934                foreach($wp_filter[$tag]["$priority"] as $filter) { 
     935                        if ($filter['function'] != $function_to_remove) { 
     936                                $new_function_list[] = $filter; 
    905937                        } 
    906938                } 
    907939                $wp_filter[$tag]["$priority"] = $new_function_list; 
    908940        } 
    909         //die(var_dump($wp_filter)); 
    910941        return true; 
    911942} 
    912943 
     944function _parse_incoming_filter($function, $accepted_args) { 
     945        // parse for the presence of :X in $function, where X is $accepted_args 
     946        if (!is_array($function)) { 
     947                $args_marker = strrpos($function, ':'); 
     948                if ($args_marker > 0) { 
     949                        $accepted_args = intval(substr($function, $args_marker+1)); 
     950                        $function = substr($function, 0, $args_marker); 
     951                } 
     952        } else { 
     953                $args_marker = strrpos($function[1], ':'); 
     954                if ($args_marker > 0) { 
     955                        $accepted_args = intval(substr($function[1], $args_marker+1)); 
     956                        $function[1] = substr($function[1], 0, $args_marker); 
     957                } 
     958        } 
     959        return array($function, $accepted_args); 
     960} 
     961 
    913962// The *_action functions are just aliases for the *_filter functions, they take special strings instead of generic content 
    914963 
    915964function do_action($tag, $arg = '') { 
    916965        global $wp_filter; 
    917  
     966        $extra_args = array_slice(func_get_args(), 2); 
    918967        if ( is_array($arg) ) 
    919                 $args = $arg + array_slice(func_get_args(), 2); 
     968                $args = array_merge($arg, $extra_args); 
    920969        else 
    921                 $args = array($arg) + array_slice(func_get_args(), 2); 
     970                $args = array_merge(array($arg), $extra_args); 
    922971         
    923972        merge_filters($tag); 
    924973         
    925         if (isset($wp_filter[$tag])) { 
    926                 foreach ($wp_filter[$tag] as $priority => $functions) { 
    927                         if (!is_null($functions)) { 
    928                                 foreach($functions as $function) { 
    929                                         $string = call_user_func_array($function, $args); 
     974        if (!isset($wp_filter[$tag])) { 
     975                return; 
     976        } 
     977        foreach ($wp_filter[$tag] as $priority => $functions) { 
     978                if (!is_null($functions)) { 
     979                        foreach($functions as $function) { 
     980 
     981                                $all_args = array_merge(array($string), $args); 
     982                                $function_name = $function['function']; 
     983                                $accepted_args = $function['accepted_args']; 
     984 
     985                                if($accepted_args == 1) { 
     986                                        $args = array($string); 
     987                                } elseif ($accepted_args > 1) { 
     988                                        $args = array_slice($all_args, 0, $accepted_args); 
     989                                } elseif($accepted_args == 0) { 
     990                                        $args = NULL; 
     991                                } else { 
     992                                        $args = $all_args; 
    930993                                } 
     994 
     995                                $string = call_user_func_array($function_name, $args); 
    931996                        } 
    932997                } 
    933998        } 
    934999} 
    9351000 
    936 function add_action($tag, $function_to_add, $priority = 10) { 
    937         add_filter($tag, $function_to_add, $priority); 
     1001function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) { 
     1002        add_filter($tag, $function_to_add, $priority, $accepted_args); 
    9381003} 
    9391004 
    940 function remove_action($tag, $function_to_remove, $priority = 10) { 
    941         remove_filter($tag, $function_to_remove, $priority); 
     1005function remove_action($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 
     1006        remove_filter($tag, $function_to_remove, $priority, $accepted_args); 
    9421007} 
    9431008 
    9441009function get_page_uri($page_id) {