WordPress.org

Make WordPress Core

Ticket #901: functionsdotphp-svn2393.patch

File functionsdotphp-svn2393.patch, 4.8 KB (added by michel v, 9 years ago)
  • 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        // check that we don't already have the same filter at the same priority 
     910        if (isset($wp_filter[$tag]["$priority"])) { 
     911                foreach($wp_filter[$tag]["$priority"] as $filter) { 
     912                        // uncomment if we want to match function AND accepted_args 
     913                        //if ($filter == array($function, $accepted_args)) { 
     914                        if ($filter['function'] == $function_to_add) { 
     915                                return true; 
     916                        } 
     917                } 
    895918        } 
     919 
     920        // So the format is wp_filter['tag']['array of priorities']['array of ['array (functions, accepted_args)]'] 
     921        $wp_filter[$tag]["$priority"][] = array('function'=>$function_to_add, 'accepted_args'=>$accepted_args); 
    896922        return true; 
    897923} 
    898924 
    899 function remove_filter($tag, $function_to_remove, $priority = 10) { 
     925function remove_filter($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 
    900926        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; 
     927 
     928        // rebuild the list of filters 
     929        if (isset($wp_filter[$tag]["$priority"])) { 
     930                foreach($wp_filter[$tag]["$priority"] as $filter) { 
     931                        if ($filter['function'] != $function_to_remove) { 
     932                                $new_function_list[] = $filter; 
    905933                        } 
    906934                } 
    907935                $wp_filter[$tag]["$priority"] = $new_function_list; 
    908936        } 
    909         //die(var_dump($wp_filter)); 
    910937        return true; 
    911938} 
    912939 
     
    914941 
    915942function do_action($tag, $arg = '') { 
    916943        global $wp_filter; 
    917  
     944        $extra_args = array_slice(func_get_args(), 2); 
    918945        if ( is_array($arg) ) 
    919                 $args = $arg + array_slice(func_get_args(), 2); 
     946                $args = array_merge($arg, $extra_args); 
    920947        else 
    921                 $args = array($arg) + array_slice(func_get_args(), 2); 
     948                $args = array_merge(array($arg), $extra_args); 
    922949         
    923950        merge_filters($tag); 
    924951         
    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); 
     952        if (!isset($wp_filter[$tag])) { 
     953                return; 
     954        } 
     955        foreach ($wp_filter[$tag] as $priority => $functions) { 
     956                if (!is_null($functions)) { 
     957                        foreach($functions as $function) { 
     958 
     959                                $all_args = array_merge(array($string), $args); 
     960                                $function_name = $function['function']; 
     961                                $accepted_args = $function['accepted_args']; 
     962 
     963                                if($accepted_args == 1) { 
     964                                        $args = array($string); 
     965                                } elseif ($accepted_args > 1) { 
     966                                        $args = array_slice($all_args, 0, $accepted_args); 
     967                                } elseif($accepted_args == 0) { 
     968                                        $args = NULL; 
     969                                } else { 
     970                                        $args = $all_args; 
    930971                                } 
     972 
     973                                $string = call_user_func_array($function_name, $args); 
    931974                        } 
    932975                } 
    933976        } 
    934977} 
    935978 
    936 function add_action($tag, $function_to_add, $priority = 10) { 
    937         add_filter($tag, $function_to_add, $priority); 
     979function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) { 
     980        add_filter($tag, $function_to_add, $priority, $accepted_args); 
    938981} 
    939982 
    940 function remove_action($tag, $function_to_remove, $priority = 10) { 
    941         remove_filter($tag, $function_to_remove, $priority); 
     983function remove_action($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 
     984        remove_filter($tag, $function_to_remove, $priority, $accepted_args); 
    942985} 
    943986 
    944987function get_page_uri($page_id) {