WordPress.org

Make WordPress Core

Ticket #901: functionsdotphp3.patch

File functionsdotphp3.patch, 6.2 KB (added by michel v, 10 years ago)
  • wp-includes/functions.php

    RCS file: /cvsroot/cafelog/wordpress/wp-includes/functions.php,v
    retrieving revision 1.270
    diff -u -r1.270 functions.php
     
    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                                         $accepted_args = 1; 
    883                                         $all_args = array_merge(array($string), $args); 
    884  
    885                                         if (!is_array($function)) { 
    886                                                 $args_marker = strrpos($function, ':'); 
    887                                                 if ($args_marker > 0) { 
    888                                                         $accepted_args = intval(substr($function, $args_marker+1)); 
    889                                                         $function = substr($function, 0, $args_marker); 
    890                                                 } 
    891                                         } else { 
    892                                                 $args_marker = strrpos($function[1], ':'); 
    893                                                 if ($args_marker > 0) { 
    894                                                         $accepted_args = intval(substr($function[1], $args_marker+1)); 
    895                                                         $function[1] = substr($function[1], 0, $args_marker); 
    896                                                 } 
    897                                         } 
    898  
    899                                         if ($accepted_args > 0) { 
    900                                                 $args = array_slice($all_args, 0, $accepted_args); 
    901                                         } elseif($accepted_args == 0) { 
    902                                                 $args = NULL; 
    903                                         } else { 
    904                                                 $args = $all_args; 
    905                                         } 
    906  
    907                                         $string = call_user_func_array($function, $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 > 0) { 
     890                                        $args = array_slice($all_args, 0, $accepted_args); 
     891                                } elseif($accepted_args == 0) { 
     892                                        $args = NULL; 
     893                                } else { 
     894                                        $args = $all_args; 
    908895                                } 
     896 
     897                                $string = call_user_func_array($function_name, $args); 
    909898                        } 
    910899                } 
    911900        } 
    912901        return $string; 
    913902} 
    914903 
    915 function add_filter($tag, $function_to_add, $priority = 10) { 
     904function add_filter($tag, $function, $priority = 10, $accepted_args = 1) { 
    916905        global $wp_filter; 
    917         // So the format is wp_filter['tag']['array of priorities']['array of functions'] 
    918         if (!@in_array($function_to_add, $wp_filter[$tag]["$priority"])) { 
    919                 $wp_filter[$tag]["$priority"][] = $function_to_add; 
     906 
     907        list($function, $accepted_args) = _parse_incoming_filter($function, $accepted_args); 
     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) { 
     915                                return true; 
     916                        } 
     917                } 
    920918        } 
     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, 'accepted_args'=>$accepted_args); 
    921922        return true; 
    922923} 
    923924 
    924 function remove_filter($tag, $function_to_remove, $priority = 10) { 
     925function remove_filter($tag, $function, $priority = 10, $accepted_args = 1) { 
    925926        global $wp_filter; 
    926         if (@in_array($function_to_remove, $wp_filter[$tag]["$priority"])) { 
    927                 foreach ($wp_filter[$tag]["$priority"] as $function) { 
    928                         if ($function_to_remove != $function) { 
     927 
     928        list($function, $accepted_args) = _parse_incoming_filter($function, $accepted_args); 
     929 
     930        // rebuild the list of filters 
     931        if (isset($wp_filter[$tag]["$priority"])) { 
     932                foreach($wp_filter[$tag]["$priority"] as $filter) { 
     933                        if ($filter['function'] != $function) { 
    929934                                $new_function_list[] = $function; 
    930935                        } 
    931936                } 
    932937                $wp_filter[$tag]["$priority"] = $new_function_list; 
    933938        } 
    934         //die(var_dump($wp_filter)); 
    935939        return true; 
    936940} 
    937941 
     942function _parse_incoming_filter($function, $accepted_args) { 
     943        // parse for the presence of :X in $function, where X is $accepted_args 
     944        if (!is_array($function)) { 
     945                $args_marker = strrpos($function, ':'); 
     946                if ($args_marker > 0) { 
     947                        $accepted_args = intval(substr($function, $args_marker+1)); 
     948                        $function = substr($function, 0, $args_marker); 
     949                } 
     950        } else { 
     951                $args_marker = strrpos($function[1], ':'); 
     952                if ($args_marker > 0) { 
     953                        $accepted_args = intval(substr($function[1], $args_marker+1)); 
     954                        $function[1] = substr($function[1], 0, $args_marker); 
     955                } 
     956        } 
     957        return array($function, $accepted_args); 
     958} 
     959 
    938960// The *_action functions are just aliases for the *_filter functions, they take special strings instead of generic content 
    939961 
    940962function do_action($tag, $arg = '') { 
    941963        global $wp_filter; 
    942  
     964        $extra_args = array_slice(func_get_args(), 2); 
    943965        if ( is_array($arg) ) 
    944                 $args = $arg + array_slice(func_get_args(), 2); 
     966                $args = array_merge($arg, $extra_args); 
    945967        else 
    946                 $args = array($arg) + array_slice(func_get_args(), 2); 
     968                $args = array_merge(array($arg), $extra_args); 
    947969         
    948970        merge_filters($tag); 
    949971         
    950         if (isset($wp_filter[$tag])) { 
    951                 foreach ($wp_filter[$tag] as $priority => $functions) { 
    952                         if (!is_null($functions)) { 
    953                                 foreach($functions as $function) { 
    954                                         $string = call_user_func_array($function, $args); 
     972        if (!isset($wp_filter[$tag])) { 
     973                return; 
     974        } 
     975        foreach ($wp_filter[$tag] as $priority => $functions) { 
     976                if (!is_null($functions)) { 
     977                        foreach($functions as $function) { 
     978 
     979                                $all_args = array_merge(array($string), $args); 
     980                                $function_name = $function['function']; 
     981                                $accepted_args = $function['accepted_args']; 
     982 
     983                                if ($accepted_args > 0) { 
     984                                        $args = array_slice($all_args, 0, $accepted_args); 
     985                                } elseif($accepted_args == 0) { 
     986                                        $args = NULL; 
     987                                } else { 
     988                                        $args = $all_args; 
    955989                                } 
     990 
     991                                $string = call_user_func_array($function_name, $args); 
    956992                        } 
    957993                } 
    958994        } 
    959995} 
    960996 
    961 function add_action($tag, $function_to_add, $priority = 10) { 
    962         add_filter($tag, $function_to_add, $priority); 
     997function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) { 
     998        add_filter($tag, $function_to_add, $priority, $accepted_args); 
    963999} 
    9641000 
    965 function remove_action($tag, $function_to_remove, $priority = 10) { 
    966         remove_filter($tag, $function_to_remove, $priority); 
     1001function remove_action($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 
     1002        remove_filter($tag, $function_to_remove, $priority, $accepted_args); 
    9671003} 
    9681004 
    9691005function get_page_uri($page_id) {