先加add_filter()添加过滤器,还是先加applay_filters()应用过滤器
过滤器(Filters)对于WordPress来说是非常重要的,它极大地扩展了WordPress的定制能力,提高了WordPress的灵活性。无论是制作主题还是开发插件,我们基本上都会或多或少地使用到过滤器,以实现我们的一些特殊需求。
其实,WordPress过滤器的使用非常简单,我们经常用到的也就两个函数而已,它们就是apply_filters和add_filter。本文将对WordPress过滤器进行详细解读与分析。
什么是过滤器?
过滤器就是注册到过滤器钩子(Filter Hook)的函数,过滤器钩子都有一个名字,在WordPress中,一般使用变量$tag来标识这个名字。所有挂接到过滤器钩子上的函数都是过滤器。
过滤器钩子和动作钩子一样,基本的函数有两个,动作钩子有do_action函数,它就有apply_filters函数,该函数是用于执行相应的过滤器函数,不同的是动作钩子仅仅是执行函数(或者称为动作,更为贴切),而过滤器钩子它要做的是通过执行过滤器函数来改变对象或变量的值,就相当于对变量或者对象进行过滤,然后再返回。
过滤器钩子相关函数:
简单地说,动作钩子要的是过程(仅仅执行代码块)而不是结果(输出值/返回值),过滤器钩子要的是结果而不是过程。
一般情况下 add_filters() 有两种方式触发,一种是当程序运行到特定时候 WordPress 程序会判断用户是否对某些参数做了新的定义,如果有则优先使用用户的设置;另一种方式是,用户可以直接通过 apply_filters() 函数直接调用。代码示例如下:
一般在模版文件或标签函数中(需要输出值),用的是apply_filters()。
apply_filters()函数
链接:https://developer.wordpress.org/reference/functions/apply_filters/
apply_filters( string $tag, mixed $value ) 参数: $tag:(字符串)(必需)过滤器钩子的名字。 $value:(混合)(必需)要过滤的值,如果没人过滤则直接返回这个值。 $var:(混合) (必需)传给过滤函数额外的变量参数,辅助过滤函数对返回值进行操作,可以添加无限个。 返回值: (混合)过滤后的值,如果没人过滤则直接返回 $value 的值。 |
举例:
// 预定义的过滤器回调函数
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 );
add_filter() 函数
链接:https://developer.wordpress.org/reference/functions/add_filter/
add_filter( $tag, $function_to_add, $priority, $accepted_args ); 参数 $tag:(字符串)(必需)所挂载的过滤器名字(和目标 apply_filters() 函数的 $tag 属性一样)。 $function_to_add:(回调)(必需)要挂载的回调函数,参考 PHP 回调函数类型文档。 $priority:(整数)(可选)执行顺序,越小函数越先被执行。默认值:10 $accepted_args:(整数)(可选)回调函数接收的参数数量,设置多个可以接收更多 apply_filters() 函数传进来的参数。默认值:1 返回值 (布尔)总是 True |
由最后一个参数我们可以了解到 add_filter() 钩子的回调函数 $function_to_add 可以接受零到多个参数,这取决于 add_filter() 最后一个参数的设置。
举例:
function example_callback( $example ) {
// 对 $example 的一系列处理过程
return $example;
}
add_filter( 'example_filter', 'example_callback' );
回调函数
要注意的是,我们在前面说过,过滤器(过滤器函数)的任务是要改变对象或变量的值,所以通过add_filter函数添加的过滤器必须要有个返回值,也就是函数$function_to_add必需有返回值。
举例:
1、没有创建过滤器(预埋过滤器钩子)
echo '这是一个值,不能被修改' ;
2、添加过滤器钩子,返回的可以修改,但是如果没有天剑过滤器,值不变
echo apply_filters( 'test', '这是一个值,能被修改' );
3、通过添加过滤器,修改值,显示“修改过的值”
function test_function(){
return '修改过的值';
}
add_filter( 'test', 'test_function' );
接受参数的用法:
1、预埋过滤器钩子:
function test_func( $text, $var, $var2 ){
return '修改值' . $var1 . $var2;
}
add_action( 'test', 'test_func', 10, 3 );
echo apply_filters( 'test', '可以被修改的值', '辅助值1', '辅助值2' );
例子
function test_func( $text, $var1, $var2 ){
return $text . $var1 . $var2;
}
add_filter( 'test', 'test_func', 10, 3 );
echo apply_filters( 'test', '参数2', '参数3', '参数4' );
打印:
test参数2参数3
apply_filters()函数:
add_filter() 函数:
举例;
function example_callback( $example ) {
// Maybe modify $example in some way.
return $example;
}
add_filter( 'example_filter', 'example_callback' );
这种情况下,代码执行到某一步遇到某个触发点,就会有执行函数 example_callback,而 apply_filters 则是主动执行。
apply_filters( 'example_filter', $value );
在页面的某处加入这个函数,则会连到 add_filter( 'example_filter', 'example_callback' );主动执行 example_callback
这个就好像点外卖,比如我要点一碗面,外卖软件在你下单前给你很多选项,要不要葱,要不要蒜,要不要辣椒要不要香菜什么的,你一个个的调好,下单后老板开始煮面,面煮好了,要放调料,就拿出你选的选项,对照着给,要葱,不要蒜,香菜没写,那就给,辣椒也没写,默认不给。
用户下单做选项时就是 add_filter
老板煮好了面对着选项给调料就是 apply_filter
还有就是第二个问题那里,只见到 apply_filters 没见到 add_filter,这个就有点难理解了,不知道是我找的方向不对还是怎么样,反正是没找到对应的 add_filter
add_filter 是主题开发者自己加的