WordPress.org

Make WordPress Core

Ticket #901: functionsdotphp-svn2365.patch

File functionsdotphp-svn2365.patch, 5.8 KB (added by michel v, 13 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) {