wordpress插件开发add_action动作钩子和add_filter()过滤器钩子

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');

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

www.admin122.com 关注微信
24小时客服在线