save_post 钩子的第三个参数 update

WordPress save_post 这个钩子有三个参数分别是:$post_ID$post$update,本篇对第三个参数 $update 总结一下。

$update 的定义

$update 是一个布尔型参数,它要么是 true,要么是 false,WordPress 开发文档对 $update 参数的定义是:

"Whether this is an existing post being updated."

字面上理解理解这句话:是否是对现有日志的更新。

上述定义带有一定的歧义和误导,事实上在日志编辑界面,并不是点更新按钮 $update 就是 true,点保存或发布按钮 $update 就是 false 。 WordPress 是根据编辑界面的标题或内容字段(仅限这两个字段)较上一次保存的版本是否发生变更来确定 $update 其值的:不管点什么按钮,只要标题或内容这两个字段有变更,$update 就是 false,否则,如果未发生变更,不管点什么按钮,点多少次,$update 的值都是 true 。

有趣的是当 $update 为 false 时,会生成修订版本,否则不生成修订版本。因此,推断 $update 这个字段可能是用来判断是否生成修订版本的。

简单一句话总结 $update 参数: 标题或内容无变动时, 点操作按钮(保存草稿/发布/更新)$update 为 true; 反之 $update 为 false 。

save_post 的触发时机

关于 save_post 这个钩子在什么情况下会触发,WordPress 开发文档给的解释如下:

save_post is an action triggered whenever a post or page is created or updated, which could be from an import, post/page edit form, xmlrpc, or post by email

大意是当我们通过编辑界面、 xmlrpc(如 wordpress APP)、 email 、导入工具,创建或更新日志或页面时,就会触发 save_post 钩子。

通过实验总结,以上解释也不是很具体。以发布一篇日志为例,从创建到保存、发布、更新,期间会多次触发 save_post 这个钩子,在此总结一下(可能不全,甚至有误)。

  1. 点 “写文章”,生成 $post_id,并立即触发 save_post 钩子,$update 值是 false
  2. 撰写新文章界面,不填任何内容, 直接点保存草稿/发布,均不触发 save_post, 发布不会成功
  3. 自动保存不触发 save_post
  4. 除以上情况,手动点保存草稿/发布/更新,都将触发 save_post

总结

如果希望借助 save_post 钩子做很细的控制操作,仅仅凭借 $update 一个参数是不够的,可能还需要通过 wp_get_post_parent_id() 借助 $post_ID 判断是否为修订版本,甚至是 save_post 第二个参数 $post 中的 post_datepost_statuspost_modified 来辅助。

wp_get_post_parent_id()会返回当前日志的父 ID,如果当前日志是修订版本,wp_get_post_parent_id() 返回它所附属日志的 post_id(大于 0);否则,返回 0 。下面结合编辑界面的按钮动作将 $update 和 wp_get_post_parent_id() 的对应值做一下总结,简短起见且将 wp_get_post_parent_id() 的返回结果命名为 parent_id

有变更 动作 $update parent_id
/ 新建 false 0
保存 true 0
发布 true 0
更新 true 0
保存 false >0
发布 false >0
更新 false >0

回复 S̆̈ 取消回复

评论(2)

  1. S̆̈ via Chrome 111

    这帖子没早发,上上周本来已经重新写了文章发布显示小尾巴的代码,因为有些没理清就没上线,上周换了主题目前没在用了。

    1. 秩秩斯干

      @S̆̈ 惭愧啊,我之前也没搞清楚。