在Wordpress专业功能开发中,开发者要理解actions
和filters
是非常必要且重要的,也就是非常有必要理解Wordpress钩子。
简单来说,钩子就是那个能通过自定义、扩展、增强Wordpress功能的强大特性,一般是通过主题、插件的接口以及自定义开发来完成这些特性的实现。
问题是,Wordpress平台这两个有争议的强大的两个开发概念,经常不是会广泛误解就是被完全忽略。
这篇文章我们就看看Wordpress页面的生命周期,理解一下钩子是怎么工作的,再看看的actions和filters之间的差别。这样我们不仅仅能成为牛逼的主题或者插件开发者,而可以更深的去理解一下Wordpress如何工作的。
注意:这篇文章的目标读着是初学者,所以如果你是个资深有经验的开发者,那就有点儿太
菜
了这篇。那如果你是个初学者,那就尽管的在文章末尾写下你的疑问,咱们一一解答。
Wordpress页面生命周期
那在我们探究 Wordpress钩子之前呢,理解一下Wordpress页面生命周期是如何的是非常重要的。
页面的生命周期也就是当用户在前端页面去向后台服务器请求内容,并返回到前台浏览器的过程。
比如,你需要去加载一个单页面,从一个比较高的角度看,Wordpress会进行下面这些流程:
- 查看要请求的内容ID
- 通过页面ID向服务器查询页面内容
- 查询相关的一些数据(比如:分类目录、标签、图片等)
- 查询数据库中相关的评论内容,然后返回数据到浏览器进行渲染。
那在浏览器上进行渲染,美化以及定位数据的任务就由模板过滤器以及一些接口方法的调用来负责。
听起来是挺简单,但是如果你想想你曾经看到过的那些复杂的博客,或者是你已经干过的一些工作,你就可以预测到这个过程是多么的复杂。
当然,这样是相对最简单的一个级别。它不会包括任何缓存机制或者是其他先进的 Wordpress特性功能。
一个相当流行的Wordpress开发者Rarst,就是 queryposts.com的作者,画了一张非常详细的Wordpress核心加载图解:
看不懂上面这张图也别失望。我把它放这只是为了图个方便。这部分的重点就是在文末之前所有的开发者能够去理解这张图。
说完上面的,接下来是理解Wordpress页面加载生命周期的关键了:
当Wordpress运行它的一系列的查询与准备工作,来将数据渲染到浏览器上,它就会查询所有的自定义钩子,也就是actions和filters。这些自定义的钩子就会在将数据在渲染到浏览器之前进行一番过滤。
到这儿呢,就有必要来讲讲钩子以及actions与filters之间的不同之处,然后它们是如何在整个页面生命周期中duangduangduang的。
Hooks - 钩子
Wordpress钩子有两个经典的实现方式:actions和filters。如果你看的是Codex上关于钩子的介绍文章,你基本看不到啥,就是一些指向actions和filter是的参考文档。不过钩子本身也就像它的介绍文档那样,简单而强大。
所以呢,关于钩子,可以这么想:
钩子允许我们定义语义化的钩子来实现在Wordpress页面的生命周期中进行查询、插入或者是修改数据,甚至可以在特定的节点来进行特定的操作。
酷吧!
但是还得有俩事情得好好琢磨以下:
- Actions和Filters是不一样的。
- 一般来说不能仅仅简单的把一个钩子安放到执行节点的场景节点上。钩子的触发需要在特定的时间段以及特定的时间点来最大化利用钩子的特征。
那就先定义下actions与filters,然后来看看什么时候发射什么钩子。
行动吧
什么是actions?最简单的定义就是:Actions就是表示发生点什么。就这么简单。那这个定义好在哪?那怎么去防止与事件这个概念混了。
我是这么定义的:
Actions就是在Wordpress页面生命周期中发生的一些事件 - 加载特定资源,执行特定功能。这也取决于一些动作发生多早,还需要加载些什么资源。
既然我们已经讨论过Wordpress页面加载生命周期,actions就是可以在特定点上执行自己的特定功能。
这就意味着你可以在页面加载的时候去自定义一些功能。
Codex已经提供了一些非常牛逼的内置actions,同时也定义好了他们发生的顺序。标记以下,记得常去这里看看。
学习如何将一些钩子安置到Wordpress执行的特定节点是基础的功能,现在就开始吧!
关键:我经常会看到开发者会将一些动作挂在init操作中。当然,当然有它应该发生的地方发生这些事情。当然如果你想在post之前发生点什么。那你可以考虑使用pre_get_posts
而不是init
,你说对不对?
那理解actions
就显得相当重要了!
来,过滤一把
过滤器,它和actions是完全不一样的。像actions,过滤器会在Wordpress页面生命周期中特定节点来进行操作,但是做什么就不一样了。
关于过滤器,我是这么想的:
过滤器就是执行的功能,Wordpress会在页面的生命周期执行的特定点进行数据过滤。一般来说是进行拦截、管理并在浏览器渲染之前进行一些处理,或者是在存到数据库之前进行一些操作。
假设一个页面要加载一篇文章。就我们对Wordpress页面的加载生命周期来说,Wordpress会从数据库查询这篇文章的数据,然后返回到浏览器。那在返回浏览器之前呢,它会进行数据的过滤,而这些过滤器呢就是预先定义好的那些。
过滤器就是将传向他们的数据进行一些处理。比如,你想在内容最后补上一些关于作者的消息。要达成这个功能,你需要注册一个自定义方法在the_content
过滤器上,然后就可以在内容最后补上你要加的信息。
具体实现就不在本文的讨论范围了。不过在将要要写的文章中可以演示下这个功能。
就想actions一样,Code同样也提供了一些列有用的过滤器。同样,有需要多多看这里。
既然大家已经对过滤器了解差不多了,那咱就可以开始在数据查询的过程中进行一些自定义操作了。好好研究下Wordpress API,它本身提供了易用而非常强大的数据操作功能。
理解过滤器非常重要!
但是,什么时候上这个?
这时候,一些不可避免的问题总是会出现。
下面给出一些常用的建议:
- 当你想往现已存在的页面添加一些类似样式、Javascript第三方库或者是发送一份邮件,而这些动作是由一些事件触发时,就推荐使用actions
- 当你想在数据被展示在浏览器之前进行一些人为操作,或者是要在存入数据库之前进行一些自定义操作,就可以使用
filters
。
还挺简单,不是吗?
结论
说到这里呢,我强烈建议大家多多看看下面这些资源:
- Plugin API也提供了一些可以在主题开发中用到的重要信息
- Action Reference
- Filter Reference
完!