WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它。

PS:本文只是简单的总结一下,更多用法还是要参考文中给出的函数。

钩子分类

钩子分为两种,一种叫做动作(action),还有一种叫做过滤器(filter)。这两种钩子实现原理基本一样,后边会讲到,使用上的区别在于过滤器有返回值,而动作没有。

动作的理念是让你在一种情况或者一个特别的位置执行一些函数,比如发送一封邮件等;过滤器则是让你修改 WordPress 核心需要用到的一个值,然后 WordPress 再用这些值做一些事情,比如函数的返回值等。

动作钩子

wp_head 是一个很常用的动作钩子,在开发主题过程中,开发者都会在 head 标签里加上 wp_head() 函数,事实上,正是这个函数调用了 wp_head 钩子。

如果插件开发者想要在 head 标签里添加一句话,就可以使用 wp_head 钩子,下边是个简单的例子。

1
2
3
4
5
//在 head 标签添加一些内容
function Bing_add_head_tag(){echo '添加内容';
}
add_action( 'wp_head', 'Bing_add_head_tag' );

添加代码后,查看前台的网页源代码,就能在 head 标签里看到我们添加的内容了。

上边是一个简单的例子,只是打印了一句话。利用这个钩子,我们还可以做一个遇到 404 页面给管理员发送一封邮件的插件,下边简单的写了一个。

1
2
3
4
5
6
7
8
9
//遇到 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' );

更多关于 add_action() 函数的内容:《 WordPress 函数:add_action()(添加动作) 》

过滤器钩子

根据我的亲身经历,可能过滤器钩子会难理解些,尤其对不熟悉 PHP 的人来说。

过滤器钩子可以让你改一些东西的值,过滤器回调函数会接受一个参数,这就是当前的值。还记得那个用来调用文章内容的 the_content() 函数吧,这个函数就提供了一个 the_content 过滤器。

给 the_content 钩子添加一个函数,这个函数需要接收一个参数,这个参数就是当前的值。

1
2
3
4
5
6
//文章内容全部链接新窗口打开
function Bing_autoblank( $content ){//$content 变量就是文章内容,因为其它过滤器也要过滤,所以这个内容可能是经过其它函数过滤的$content = str_replace( '<a', '<a target="_blank"', $content );//添加 target="_blank"return $content;//必须要把过滤后的内容返回回去,否则值就丢了
}
add_filter( 'the_content', 'Bing_autoblank' );

更多关于 add_filter() 函数的内容:《 WordPress 函数:add_filter()(添加过滤器) 》

调用钩子

WordPress 核心是怎么调用这些钩子的就不再这篇文章了,可以参考下边两篇文章。

动作钩子:《 WordPress 函数:do_action()(执行动作) 》

过滤器钩子:《 WordPress 函数:apply_filters()(创建过滤器) 》

钩子原理

事实上,在调用 add_action() 和 add_filter() 的时候,只是向 $wp_filter 全局变量添加了一个数组元素,还要说的就是动作和过滤器是公用的一个全局变量,也就是说,过滤器和动作是不能重名的。

当调用 do_action() 的时候,会查找 $wp_filter 全局变量中都有哪些添加到此动作的函数,循环执行即可。

apply_filters() 比 do_action() 多了一个步奏,就是每次调用函数时还要接收这个函数的返回值,最后把经过多次过滤的值返回出去,供使用。

Reference from : http://www.endskin.com/hook.html

转载于:https://www.cnblogs.com/zhangchenliang/p/4000219.html

WordPress 插件机制的简单用法和原理(Hook 钩子)相关推荐

  1. 解析 WordPress 插件机制

    一直对软件的组件.插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充 系统的功能.Eclipse就是一个非常棒的例子,几乎你想什么 ...

  2. wordpress中remove_action、add_action、 do_action()的hook钩子都有哪些

    原文地址:http://codex.wordpress.org/Plugin_API/Action_Reference muplugins_loaded After must-use plugins ...

  3. Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结

    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 ...

  4. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  5. python做插件应用_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  6. python插件使用教程_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  7. python加载机制_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  8. 使用Mailgun WordPress插件增加订户

    Mailgun插件的新列表订阅功能 Mailgun WordPress插件一直是简单,轻松,经济地向WordPress服务器添加出站电子邮件支持的简单方法,而无需担心运行自己的SMTP服务的麻烦. 现 ...

  9. 如何安装 WordPress 插件?我告诉你2种常用方法

    插件是 WordPress 生态系统的命脉. 它们使 CMS(内容管理系统)在同行中独一无二,因为它们为平台带来了绝对的可扩展性. 许多用户因为插件而被WordPress吸引,但不知道如何安装 这个 ...

  10. Wordpress插件检测机制原理

    Wordpress插件界面里,这些用户自定义的plugin是从哪里来的? 在Wordpress目录下面有一个文件夹叫做plugins,这里面的所有文件都成为Wordpress扫描plugin的cand ...

最新文章

  1. Asp.net 2.0 C#实现压缩/解压功能
  2. 关于无法创建aps.web项目的解决办法
  3. ajax文件上传报400,js ajaxfileupload.js上传报错的解决方法
  4. 【Qt】Qt学习资料汇总
  5. centos6mysql编译安装_centos6编译安装MySQL
  6. 回归统计在DMP中的实战应用
  7. [css] 你有没有自己写过一套UI库?说下遇到哪些难点?
  8. java四舍五入自己写_java提高篇-----详解java的四舍五入与保留位
  9. 读《刘帅:在失望中寻找希望》有感
  10. PHP数组实现菜单无限极分类
  11. 常见的图标库有哪些?
  12. 易语言游戏选服务器,网吧游戏菜单服务器含服务器端和客户端
  13. SOUI GDI+渲染引擎下的字体特效,抛砖引玉
  14. Win10文件夹Shift+右键菜单添加打开管理员Powershell窗口
  15. 【PCB专题】PCB板卡上的UL标识是什么?
  16. 钉钉显示服务器升级是什么意思,服务器升级自动通知钉钉群并报告环境功能
  17. spring cloud: TX-LCN解决分布式事务
  18. flash制作打地鼠游戏代码,打地鼠游戏编程代码
  19. htc 8x android,htc 8x的usb驱动下载
  20. r语言 siar 代码_sair方法及R操作入门——稳定同位素之食物来源比例分析

热门文章

  1. 【三维路径规划】基于matlab改进差分算法多无人机协同三维路径规划【含Matlab源码 169期】
  2. 【VRP】基于matlab禁忌搜索算法求解车辆路径规划问题【含Matalb源码 158期】
  3. 傅里叶变换对照表_傅里叶分析推导
  4. 快二游戏数据分析_1.更快的数据分析
  5. 超轻粘土机器人_超轻粘土 | 天近秋,背上行囊,捎上橡果,我们出发去远方
  6. php mysql账号注册_php mysql用户注册登陆代码_PHP教程
  7. sql统计各科成绩大于平均分的人_SQL第三关:汇总分析
  8. beta分布_浅谈分布之分布(beta分布)贝叶斯分析之1 精选
  9. IO流(1)--文件流及其原理
  10. topcoder srm 440 div1