WordPress常用两种钩子,过滤钩子和动作钩子。过滤钩子相关函数及源码分析在上篇文章中完成,本篇主要分析动作钩子源码。
然而,在了解了动作钩子的源码后你会发现,动作钩子核心代码竟然跟过滤钩子差不多!是的,至此,我不得不告诉你,动作钩子只是WP开发者为了区分概念而把过滤钩子另外命名的一种东西!当然,它们还是有一些细微的差别,下面我们将从源码来深入解读。
动作钩子概念:动作钩子是WP代码执行到某处或某个事件发生时触发的一系列函数,插件可以利用动作钩子API在WP代码执行的特定点之前插入一系列函数以控制执行。它跟过滤钩子极像,唯一不同的是过滤钩子返回一个处理后的值,而动作钩子仅完成函数执行并不返回值,如果钩子不存在则返回NULL并新增该钩子。
动作钩子原理:由于动作钩子和过滤钩子几乎一样,所以它们的实现原理也是一样的。它主要利用一个全局变量$wp_filter,增加动作函数时使用add_action()函数给全局变量$wp_filter增加了一个数组元素,这个元素键名中含有钩子名,值中含有对应函数及执行优先级等信息,在调用do_action()函数使用动作钩子时,它通过循环查找出所有跟钩子关联的函数并将其依次调用,最后返回处理后的数据。
<?php
echo "
<h2>高级教程add_action动作和add_filter()过滤器</h2>
";
//1.学会使用add_action()方法添加一个动作钩子
//定义一个shuohua 的函数
function shuohua(){
echo "说话
";
}
function zoulu(){
echo "走路
";
}
//挂载shuohua这个函数到huangcong这个动作钩子上
add_action('huangcong','shuohua');
add_action('huangcong','zoulu');
//2.学会使用do_action()方法运行动作钩子
//运行huangcong这个动作,把所有挂载在这个动作上的函数都执行一遍
do_action('huangcong');
//3.学会使用wp内置的动作钩子
//见插件he.php
//wp_footer() //wp-include/general-template.php
//4.学会使用add_filter()方法添加一个过滤器钩子,与add_action()相同
//定义一个zhuijia函数
function zhuijia($text){
echo $text . ".......
";
}
function zhuijia1($text){
echo $text . "!!!!!!
";
}
//挂载zhuijia这个函数到shuchu这个过滤器钩子上,与add_action()相同
add_filter('shuchu','zhuijia');
add_filter('shuchu','zhuijia1');
//创建一个shuchu过滤器,传递要过滤的字符串;
apply_filters('shuchu','WP管理员之家');
//与do_action()的区别是有返回结果,而do_action()只是执行,而没有返回结果,所以add_action()挂载的函数中,尽量有echo,这样就可以在do_action()后看到结果
add_action('sc','zhuijia');
add_action('sc','zhuijia1');
do_action('sc','黄鼠狼');
//5.学会使用wp内置的过滤器钩子
//见插件he.php
//the_content(); //wp-include/post-template.php
he.php
<?php /** * @package ceshi * @version 1.0 */ /* Plugin Name: admin122ceshi Plugin URI: http://www.wpadmin.cn/blog/?p=3644 Description: 这就是一个测试插件 Author: zst Version: 1.0 Author URI: http://www.wpadmin.cn */ function hit_top(){ echo "<div><a href='#'>TOP</a></div>"; } //挂载hit_top函数到wp_footer这个动作钩子上 add_action('wp_footer','hit_top'); function xianshi($content){ return "WP管理员之家说:" . $content; } //挂载xianshi函数到the_content这个过滤器钩子上 add_filter('the_content','xianshi');