操作环境
操作系统信息:
master@ubuntu:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.6 LTS Release: 16.04 Codename: xenial
WordPress 信息:
主程序版本:WordPress 5.3.2
主题及版本:Twenty Sixteen(版本:2.0, 由WordPress团队开发)
准备工作
本文接下来的操作及演示过程中会用到 WordPress 自带的 Gutenberg 编辑器的“自定义字段”功能。默认情况下,该编辑器的自定义字段功能是关闭的,这里我们需要将其开启。
开启方法是在文章编辑页面,点击右上角位置的三个竖排小点,之后点击“选项按钮”,如图 1 所示:
在选项菜单的最下面的高级面板中勾选“自定义字段”即可,如图 2 所示:
之后,即可在文章编辑页面看到自定义字段控制面板,如图 3 所示:
操作过程
WordPress 的自定义字段为我们自定义 WordPress 文章提供了很大的方便。在这里,我们需要使用 WordPress 平台提供的 update_post_meta()
这个函数来实现对自定义字段的控制。
update_post_meta()
函数的使用格式如下:
update_post_meta( int $post_id, string $meta_key, mixed $meta_value, mixed $prev_value = '' )
功能描述如下:
“Updates a post meta field based on the given post ID.”
即:“通过文章 ID 实现对特定文章内自定义字段的更新。”
update_post_meta()
函数各个参数的含义如下:
- $post_id
(int 类型) (必须参数) 文章 ID. - $meta_key
(string 类型) (必须参数) 元数据值。 - $meta_value
(混合类型) (必须参数) 元数据值,如果是非标量,则必须可序列化。 - $prev_value
(混合类型) (可选参数) 更新之前要检查的值,默认是:”
于是,我们可以构建一个自定义字段,显示当前文章的保存时间:
update_post_meta($post_id, "save-time", "保存时间为:".date("Y-m-d H:i:s"));
接下来,将上述代码封装到一个函数 zkf_save_post_meta
中,在函数的参数内为其传入 $post_id
:
function zkf_save_post_meta($post_id) { update_post_meta($post_id, "save-time", "保存时间为:".date("Y-m-d H:i:s")); }
但是,此时 WordPress 仍无法执行 zkf_save_post_meta
这个函数,必须把该函数挂载到合适的钩子上才可以。
通过前面一篇文章《WordPress开发:WordPress动作钩子add_action参数解析》,我们知道,WordPress 中提供了一个名为 save_post
的钩子。该钩子存在于 wp-includes/post.php
文件中并通过如下代码被触发:
do_action( 'save_post', int $post_ID, WP_Post $post, bool $update )
上述代码代表的动作会在文章被保存时触发 save_post
钩子并调用该钩子所挂载的函数。于是,我们可以把 zkf_save_post_meta
函数挂载到 save_post
钩子上,代码如下:
add_action('save_post', 'zkf_save_post_meta', 10, 1);
在上面的代码中,我们设置挂载到 save_post
钩子上的这个动作(函数)的优先级为 10, 传入的参数是 zkf_save_post_meta
函数的地一个参数 $post_id
, 通过 save_post
钩子的格式(如下)我们知道,激活 save_post
这个钩子所需的第一个参数也是文章 ID:
do_action( 'save_post', int $post_ID, WP_Post $post, bool $update )
完整代码如下:
add_action('save_post', 'zkf_save_post_meta', 10, 1); function zkf_save_post_meta($post_id) { update_post_meta($post_id, "save-time", "保存时间为:".date("Y-m-d H:i:s")); }
之后,刷新 WordPress 文章编辑界面,可以看到如下内容:
由图 4 可以看到,使用东八区时间的我的 Ubuntu 的时间显示的是上午 10 点 45 分,但是 WordPress 自定义字段显示的时间却是凌晨 2 点 45 分,二者相差 8 个小时。这是因为 WordPress 默认使用的时区是 UTC 协调世界时。
要给 WordPress 插件指定其所使用的时区,需要在插件文件的开头写入以下代码:
//指定时区为“亚洲/上海” date_default_timezone_set("Asia/Shanghai");
之后,再次刷新文章编辑页面就会发现,自定义字段显示的就是东八区的时间了。
References:
[1]. update_post_meta() | Function | WordPress Developer Resources
https://developer.wordpress.org/reference/functions/update_post_meta/
EOF