动作钩子
do_action
do_action(钩子名称:String, 参数1, 参数2...)
预埋钩子,执行“add_action”的动作钩子,并提供动作的额外参数。
add_action
add_action(钩子名称:String, 回调函数:Function, 优先级:Number)
添加钩子动作,当代码运行到“do_action”时,联动同名的操作。联动的回调参数接收do_action
传递的参数。
- 默认优先级:10
- 逻辑上完全相同(===)的同一个钩子,只会添加一次
例:在下面的工作流中,根据当前时间判断是早上还是晚上。并调用不同的外部方法
//==========添加可用钩子============
add_action('in_the_night',function(time){
console.log("It's " + time + ", I have to sleep.");
});
add_action('in_the_morning',function(time){
console.log("It's " + time + ", I have to go to school.");
});
//==========正常的代码工作流============
var date = new Date(),
hour = date.getHours(),
minute = date.getHours(),
time = hour + ":" + minute;
if (hour >= 21 && hour <= 23) {
console.log('Good night!');
do_action('in_the_night', time);
}
if (hour >= 6 && hour <= 9) {
console.log('Good morning!');
do_action('in_the_morning', time);
}
//==========运行结果===========
// 在6点~9点间,屏幕输出:
// Good morning!
// It's (当前时间), I have to go to school.
//
// 在21点~23点间,屏幕输出:
// Good night!
// It's (当前时间), I have to sleep.
过滤器钩子
apply_filters
过滤结果 = apply_filters(钩子名称:String, 被过滤的参数, 额外参数1, 额外参数2...)
预埋过滤器,执行add_filter
的过滤器,并提供被过滤的数据。
若添加的过滤器有多个,则被过滤的数据为上一个过滤器返回的数据。
add_filter
add_filter(钩子名称:String, 回调函数:Function, 优先级:Number)
添加钩子过滤器,当代码运行到apply_filters
时,运行回调函数,在函数中并返回过滤后的参数。
- 必须返回参数,原则上返回的过滤后的参数应该与被过滤的参数类型、结构相同
- 默认优先级:10
- 逻辑上完全相同(===)的同一个钩子,只会添加一次
例:有一个students的数组中包含每个学生的姓名、年龄、和自我介绍。读取自我介绍时进行过滤:当学生没有自我介绍时,自动根据名字和年龄生成自我介绍。
//==========添加可用钩子============
add_action('introduce_oneself',function(introduce_original, name, age){
if (introduce_original == "") {
//没有自我介绍,自动根据额外的参数(姓名和年龄)自动生成
return "My name is " + name + ", I am " + age + " years old.";
} else {
//有自我介绍,不作处理,直接返回
return introduce_original;
}
});
//==========正常的代码工作流============
var students = [
{
name: "Mary",
age: 12,
introduce: ""
},
{
name: "Bob",
age: 13,
introduce: "I'm Bob, I like football."
}
];
//输出自我介绍
for (var i = 0; i < students.length; i++) {
// 执行过滤器,给过滤器传入被过滤的参数(introduce)、额外参数(name,age)
var introduce_filtered = apply_filters("introduce_oneself", students[i].introduce, students[i].name, students[i].age);
console.log(introduce_filtered);
}
//==========运行结果===========
// 屏幕输出:
// My name is Mary, I am 12 years old.
// I'm Bob, I like football.
移除钩子
移除动作钩子:
remove_action(钩子名称:String, 回调函数:Function)
移除过滤器钩子:
remove_filter(钩子名称:String, 回调函数:Function)
只有Function完全相同(===)时,才会被移除。与WordPress的PHP钩子不同的是,无需提供优先级即可移除。
例:
//==========添加可用钩子============
// Take some apple.
function take_apple(original_apple) {
return original_apple - 3;
}
add_filter('count_apple',take_apple);
// Put them back
remove_filter('count_apple',take_apple);
//==========正常的代码工作流============
var original_apple = 5;
var new_apple = apply_filters("count_apple", original_apple);
console.log("There are " + new_apple + " apples.");