来源:互联网
WordPress 中有一种叫执行挂勾的机制,允许插件把一些功能“挂载”到 WordPress 当中。也就是说,在系统运行至某一个环节时,去调用插件内的一些函数。WordPress中有2个函数可以让我们执行WordPress标准操作到时候调用我们自定义的函数,这2个函数分别是add_action()和add_filter()。
先看看WordPress里面关于这2个函数的定义,在wp-includes/plugin.php文件中,先看add_filter()的定义:
function
add_filter(
$tag
,
$function_to_add
,
$priority
= 10,
$accepted_args
= 1) {
global
$wp_filter
,
$merged_filters
;
$idx
= _wp_filter_build_unique_id(
$tag
,
$function_to_add
,
$priority
);
$wp_filter
[
$tag
][
$priority
][
$idx
] =
array
(
'function'
=>
$function_to_add
,
'accepted_args'
=>
$accepted_args
);
unset(
$merged_filters
[
$tag
] );
return
true;
}
再看看add_action()函数的定义:
function
add_action(
$tag
,
$function_to_add
,
$priority
= 10,
$accepted_args
= 1) {
return
add_filter(
$tag
,
$function_to_add
,
$priority
,
$accepted_args
);
}
看到这里你也许就明白了,其实add_action()是调用add_filter()的功能,没有加入新的处理操作,说明这两个函数是没有什么区别的。下面来详细说说add_filter()函数。
通过add_filter()函数的定义,我们可以看到该函数是把我们要hook的函数的一些变量存储在global $wp_filter这样一个全局数组中的,包括$tag,即我们要hook的函数,$priority即hook的顺序,还有就是$idx这个就是我们自定义函数的名称了。
值得注意的是如果我们在使用add_filter这个函数的时候如果指定顺序,那么默认的就是10,这个在插件开发的时候值得注意一下,以免和其它插件产生冲突。下面看看该函数的用法。
用法
<?php add_filter(
$tag
,
$function_to_add
,
$priority
= 10,
$accepted_args
= 1); ?>
参数
$tag
(字符串)(必需)连接到$function_to_add的过滤器名称
默认值:None
$function_to_add
(回调)(必需)应用过滤器时被调用函数的名称
默认值:None
$priority
(整数)(可选)用于规定函数被执行的顺序,函数与特定动作关联。较小的数字匹配较早的执行,同等优先级的函数按加入action的顺序被执行。
默认值:10
$accepted_args
(整数)(必需)函数所接受参数的数量。在WordPress 1.5.1及之后版本中,连接的函数可吸收其它在调用do_action() 或 apply_filters()时设置的参数。
默认值:None
用户还需要为过滤器回调时函数的命名空间提供一个指示器,如:
<?php add_filter(‘media_upload_newtab’,
array
(&
$this
, ’media_upload_mycallback’)); ?>
否则WordPress会为函数查找自备命名空间,从而引发异常状况。
返回的值
$function_to_add 成功添加到$tag过滤器时返回true。返回函数可接受的参数数量。在WordPress 1.5.1及之后版本中,连接的函数可吸收其它在调用do_action() 或 apply_filters()时设置的参数。例如,comment_id_not_found动作将传递任何函数,若该函数将所请求的评论编号连接到该动作。
示例
博客发表新内容时用电子邮件通知朋友:
function
email_friends(
$post_ID
) {
$friends
= 'bob@example.org'
mail(
$friends
,
"sally's blog updated"
, 'I just put something on my blog: http:
//blog.example.com');
return
$post_ID
;
}
add_filter(
'publish_post'
,
'email_friends'
);
总结一下:网上很多说到add_filter与add_action的区别,说的主观上的区别,add_filter是指在数据显示之前对数据进行一些处理,而add_action则是执行一下复杂的操作。其实二者在功能上是没有任何区别的。