[插件开发]获知文章状态变化

文章(post)是 WordPress 博客的核心价值所在,围绕一篇文章的增、删、改,我们可以开发很多有用的插件。近来,由于维护一款插件的需要,我碰巧研究了一下围绕文章发布流程而设立的一些钩子(hook)。微有所得,记录备查。

事情的起因是插件中的一个函数hook到了一个action上,名字是publish_post,顾名思义,在文章发布时候被激发的。为了要更清楚地掌控这个action,我想在源代码中,把触发点给找出来,这一找,问题来了。理论上,我们hook任何action,WP内部都会有对应的do_action来激发这个钩子,这一次,一搜,根本没有publish_post,那就有点小麻烦,说明具体激发哪个钩子,是运行时决定的,再明白点说吧,这个action的名字,应该使用变量拼出来的,所以我们直接搜publish_post很难找到调用点。

具体寻找的过程,我也不想赘述了,无非是查文档,搜代码。这里想要一提的是,我发现一个新的小技巧,给技巧取个名字叫“农村包围城市”,因为一下无法定位到想要找的代码,那么能准确定位其周边代码也是可以的,至少可以缩小查找范围。从文档中我们看到,在publish_post被激发的点附近,应该还有save_post,那么搜一下save_post,乖乖,准确找到了,然后就看到还有wp_insert_post,pre_post_update等等。然后,马上写一个小插件,向4个感兴趣的点hook,然后随便发布一下文章,根据打出的log,基本确定了publish_post就在pre_post_update和save_post中间激发。这时候就剩下80行左右的范围了,那一行行找还是很快的。

最终结果还是比较有意思的,有个函数叫wp_transition_post_status,这里面提供了3个hook,也可以说n个吧,因为这里面就看到了那个运行时才决定的hook名称的代码。最后不但搞清楚了publish_post的激发原理,还发现了原来可以随意通过hook监测每篇文章的状态变化。虽然短期内看不出来有啥用,但是以后一定可以想出来一些应用的。

  • transition_post_status 当一篇文章或者页面状态变化时触发,三个参数,分别是原状态,现在状态,文章对象本身
  • 状态_to_状态 某个具体的状态流转时候触发,可以是draft_to_pending,private_to_publish等等,只要是合法的status取值,可以随意组合。一个参数是文章对象本身。
  • 状态_类型 一个状态+一个类型,可以知道publish_post这个钩子,本质上就是这种,真实含义是有一篇类型是post(还可以是page)的文章,状态变成了publish,而不是已开始我理解成的发布一篇文章时候激发。说起来差别不大,但是你对其的理解已经完全变掉了。以此类推,你可以hook到private_post,还可以是draft_page等等。随意组合。

通过上述非常灵活的3种钩子,我们就可以随时掌控任何文章的状态变化了。