前两天学习了 add_filters() 函数,详见>>> WordPress学习——add_filter()详解 ,今天趁热打铁再来学习下它的使用。一般情况下 add_filters() 有两种方式触发,一种是当程序运行到特定时候 WordPress 程序会判断用户是否对某些参数做了新的定义,如果有则优先使用用户的设置;另一种方式是,用户可以直接通过 apply_filters() 函数直接调用。代码示例如下:
// 预定义的过滤器回调函数
function example_callback( $string, $arg1, $arg2 ) {
// (maybe) modify $string
return $string;
}
add_filter( 'example_filter', 'example_callback', 10, 3 );
// 通过 apply_filters() 传参调用定义好的过滤器回调函数
$value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );
apply_filters() 有两个固定参数以及其他我们需要传递给过滤器回调函数的参数,其调用方法如下所示:
apply_filters( string $tag, mixed $value,$var,... )
$tag:必填(字符串)。过滤器钩子的名称。
$value:必填(混合)。可以被过滤器函数修改的值要过滤的值,如果没人过滤则直接返回这个值。
$var:可选(混合)传给过滤函数的额外的参数,辅助过滤函数对返回值进行操作,可以添加无限个。
最后,apply_filters() 函数定义在 wp-includes/plugin.php 文件中,具体代码如下:
function apply_filters( $tag, $value ) {
global $wp_filter, $wp_current_filter;
$args = array();
// Do 'all' actions first.
if ( isset($wp_filter['all']) ) {
$wp_current_filter[] = $tag;
$args = func_get_args();
_wp_call_all_hook($args);
}
if ( !isset($wp_filter[$tag]) ) {
if ( isset($wp_filter['all']) )
array_pop($wp_current_filter);
return $value;
}
if ( !isset($wp_filter['all']) )
$wp_current_filter[] = $tag;
if ( empty($args) )
$args = func_get_args();
// don't pass the tag name to WP_Hook
array_shift( $args );
$filtered = $wp_filter[ $tag ]->apply_filters( $value, $args );
array_pop( $wp_current_filter );
return $filtered;
}