如何在回调函数中获取 WordPress 接口的当前优先级
首先这是一个比较深的问题,一般情况下用不到,但是一些很特殊的情况下需要用到,如果用到了,这篇文章就对你有很大的帮助。下面开始教程:
如何获取 Hook 优先级
我们在 WordPress 进行开发的时候,肯定会使用到 WordPress 的 Hook,通过 add_filter
或者 add_action
把某个回调函数传递给某个 Hook 接口,比如:
add_filter('content_save_pre', 'wpjam_filter_content_save_pre', 10, 1);
上面的代码就是在保存内容之前,使用回调函数 wpjam_filter_content_save_pre
对内容保存到数据库之前进行预处理,然后还有两个参数,分别是优先级和定义回调参数的个数。
在回调函数中,我们可以通过 current_filter
函数可以获取当前回调函数是在执行那个 Hook 中,但是如果要获取当前回调函数优先级,WordPress 就没有相关的函数了,所以我自己写了一个:
function wpjam_get_current_priority($name=null){
$name = $name ?: current_filter();
$hook = $GLOBALS['wp_filter'][$name] ?? null;
return $hook ? $hook->current_priority() : null;
}
获取 Hook 优先级有什么用
我们可能要移除接口的某个回调函数,然后最后又要加回来,怎么处理呢?在要移除的回调函数的优先级之前定义一个相同接口的回调函数移除,在要移除的回调函数的优先级之后定义一个相同接口的回调函数加回来。
如果和我一样为了偷懒,这前后的移除和添加的回调函数是同一个,那就要在回调函数中判断当前的优先级了:
function wpjam_filter_content_save_pre($content){
if($content && is_serialized($content)){ // 确保是序列化的内容
$var = 'content_save_pre_filter_removed';
$hook_name = 'content_save_pre';
$callback = 'wp_filter_post_kses';
$priority = wpjam_get_current_priority($hook_name);
if($priority < 10){ // 之前移除 wp_filter_post_kses 这个回调函数
if(has_filter($hook_name, $callback)){
remove_filter($hook_name, $callback);
wpjam_set_current_var($var, true);
}
}else{ // 之后加回 wp_filter_post_kses 这个回调函数
if(wpjam_get_current_var($var)){ // 确保是真实移除的才加
add_filter($hook_name, $callback);
wpjam_set_current_var($var, false);
}
}
}
return $content;
}
add_filter('content_save_pre', 'wpjam_filter_content_save_pre', 1);
add_filter('content_save_pre', 'wpjam_filter_content_save_pre', 11);
上面的代码就是如果存储的 WordPress 内容是被序列化的,就移除接口 content_save_pre
wp_filter_post_kses
的回到函数,并且在之后加回,防止其他非序列化的内容保存的时候也不执行 wp_filter_post_kses
回调。
该功能已经整合到 WPJAM Basic 插件中,并已免费提供下载,简单勾选或者设置下即可开启!