WordPress系列之钩子hook的作用及基本用法
WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它。
钩子分类
钩子分为两种,一种叫做动作(action),还有一种叫做过滤器(filter)。这两种钩子实现原理基本一样,后边会讲到,使用上的区别在于过滤器有返回值,而动作没有。
动作的理念是让你在一种情况或者一个特别的位置执行一些函数,比如发送一封邮件等;过滤器则是让你修改 WordPress 核心需要用到的一个值,然后 WordPress 再用这些值做一些事情,比如函数的返回值等。
动作钩子
wp_head 是一个很常用的动作钩子,在开发主题过程中,开发者都会在 head 标签里加上 wp_head() 函数,事实上,正是这个函数调用了 wp_head 钩子。
如果插件开发者想要在 head 标签里添加一句话,就可以使用 wp_head 钩子,下边是个简单的例子。
//在 head 标签添加一些内容
function Bing_add_head_tag(){
echo '添加内容';
}
add_action( 'wp_head', 'Bing_add_head_tag' );
添加代码后,查看前台的网页源代码,就能在 head 标签里看到我们添加的内容了。
上边是一个简单的例子,只是打印了一句话。利用这个钩子,我们还可以做一个遇到 404 页面给管理员发送一封邮件的插件,下边简单的写了一个。
//遇到 404 页面给管理员发送邮件
function Bing_404_page_mail(){
if( !is_404() ) return;//如果不是 404 页面就退出函数
$to = get_option( 'admin_email' );//获取管理员地址
$subject = '遇到 404 页面啦!';//邮件标题
$message = '404 页面的地址:http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];//邮件内容
wp_mail( $to, $subject, $message );//发送邮件
}
add_action( 'wp_head', 'Bing_404_page_mail' );
过滤器钩子
过滤器钩子可以让你改一些东西的值,过滤器回调函数会接受一个参数,这就是当前的值。还记得那个用来调用文章内容的 the_content() 函数吧,这个函数就提供了一个 the_content 过滤器。
给 the_content 钩子添加一个函数,这个函数需要接收一个参数,这个参数就是当前的值。
//文章内容全部链接新窗口打开
function Bing_autoblank( $content ){//$content 变量就是文章内容,因为其它过滤器也要过滤,所以这个内容可能是经过其它函数过滤的
$content = str_replace( '<a', '<a target="_blank"', $content );//添加 target="_blank"
return $content;//必须要把过滤后的内容返回回去,否则值就丢了
}
add_filter( 'the_content', 'Bing_autoblank' );
钩子原理
事实上,在调用 add_action() 和 add_filter() 的时候,只是向 $wp_filter 全局变量添加了一个数组元素,还要说的就是动作和过滤器是公用的一个全局变量,也就是说,过滤器和动作是不能重名的。
当调用 do_action() 的时候,会查找 $wp_filter 全局变量中都有哪些添加到此动作的函数,循环执行即可。
apply_filters() 比 do_action() 多了一个步奏,就是每次调用函数时还要接收这个函数的返回值,最后把经过多次过滤的值返回出去,供使用。
获取当前钩子列表
WordPress 的动作和过滤器是插件机制的核心部分,允许你在特定的地方主动添加自己需要执行的动作,一般使用 add_action() 和 add_filter() 函数挂载函数。
这些钩子被储存在 $wp_filter 全局变量里,所以,要获取钩子列表,可以直接获取 $wp_filter 全局变量。
<pre><?php var_dump( $GLOBALS['wp_filter'] ); ?></pre>
上边的代码会打印出钩子列表数组。
WordPress系列之钩子hook的作用及基本用法的更多相关文章
- WordPress中函数钩子hook的作用及基本用法
WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它.钩子分类 钩子分为两种,一 ...
- 理解钩子Hook以及在Thinkphp下利用钩子使用行为扩展
什么是钩子函数 个人理解:钩子就像一个”陷阱”.”监听器”,当A发送一个消息到B时,当消息还未到达目的地B时,被钩子拦截调出一部分代码做处理,这部分代码也叫钩子函数或者回调函数 参考网上说法 譬如我们 ...
- C# 钩子HOOK专题(1)
目录 基本概念 运行机制 钩子类型 作者 基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程 ...
- 框架Thinkphp5 简单的实现行为 钩子 Hook
这篇文章主要介绍了关于框架Thinkphp5 简单的实现行为 钩子 Hook,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 实现在一个方法开始和结束加入两个行为:api_init.ap ...
- 闭包传参 余额计算 钩子hook 闭包中的this JavaScript 钩子
闭包传参 余额计算 钩子hook 小程序 a=function(e){console.log(this)}() a=function(e){console.log(this)}() VM289 ...
- 钩子(hook)
钩子(hook)编程 钩子(hook)编程 一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows ...
- WordPress 数据库结构及表字段作用解析
对于WordPress的开发可以说子凡已经是如痴如醉了,通过 WordPress 本身的开放性接口可以做到很多的事情,但是有些时候我们可能更喜欢直接查询数据库来实现某些 WordPress 没有提供的 ...
- 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性
委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { ...
- 【HANA系列】SAP HANA SQL IFNULL和NULLIF用法与区别
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL IFN ...
随机推荐
- 关于js无法设置input的value的问题
html内容来自: <script type="text/html" id="theTemplate"> <input id="in ...
- 打印控件Lodop的使用
前些天发现一个不错的打印的控件Lodop,下面就来介绍一下具体使用! 首先到官网:http://www.lodop.net/download.html 下载最新版,文档的话官网中有很详细的介绍,这里演 ...
- servlet方法
1.每一个Servlet都必须要实现Servlet接口,GenericServlet是个通用的.不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于Generi ...
- poj2104(划分树模板)
poj2104 题意 给出一个序列,每次查询一个区间,要求告诉这个区间排序后的第k个数. 分析 划分树模板,O(mlogn). 建树.根据排序之后的数组,对于一个区间,找到中点的数,将整个区间分为左右 ...
- csu1808
csu1808 题意 n 个点间有 m 条地铁,每条地铁可能属于不同的线路,每条地铁有权值即通过时花费的时间,如果乘坐第 i 条地铁来到地铁站 s,再乘坐第 j 条地铁离开,需要花费额外的时间 \(| ...
- 洛谷——P1706 全排列问题
P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成 ...
- 【模拟】Friday the Thirteenth
题目描述 Is Friday the 13th really an unusual event?That is, does the 13th of the month land on a Friday ...
- 八. 输入输出(IO)操作6.文件与目录管理
目录是管理文件的特殊机制,同类文件保存在同一个目录下不仅可以简化文件管理,而且还可以提高工作效率.Java 语言在 java.io 包中定义了一个 File 类专门用来管理磁盘文件和目录. 每个 Fi ...
- Bluetooth篇 开发实例之七 匹配&UUID
匹配和通信是两回事. 1.用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在SDK中给出.但是可以通过反射来获取. 知道这两个API的 ...
- centos下mysql集群初尝试
原文:http://www.lvtao.net/database/mysql-cluster.html 五台服务器篇 安装要求 安装环境:CentOS-6.3安装方式:源码编译安装软件名称:mysql ...