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 为 true 时,会生成修订版本,否则不生成修订版本。因此,推断 $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 这个钩子,在此总结一下(可能不全,甚至有误)。
- 点 “写文章”,生成
$post_id
,并立即触发 save_post 钩子,$update 值是 false - 撰写新文章界面,不填任何内容, 直接点保存草稿/发布,均不触发 save_post, 发布不会成功
- 自动保存不触发 save_post
- 除以上情况,手动点保存草稿/发布/更新,都将触发 save_post
总结
如果希望借助 save_post 钩子做很细的控制操作,仅仅凭借 $update 一个参数是不够的,可能还需要通过 wp_get_post_parent_id()
借助 $post_ID
判断是否为修订版本,甚至是 save_post 第二个参数 $post
中的 post_date
、 post_status
、 post_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̆̈ 惭愧啊,我之前也没搞清楚。