在本站的文章深入理解WordPress中的内容类型 post type 中,我为大家介绍了 WordPress 的四种主要内容类型,今天我们来介绍一下和这四种内容类型相关连的附加内容,也就是元数据。WordPress Database中有 4 种不同的数据类型,他们分别存储在以下 4 个数据表中。
- posts
- users
- comments
- links
前面的 3 种数据类型都有自己的元数据,并且有自己的数据表来存储这些元数据。
什么是元数据
元数据可以理解为关于数据的数据 Wikipedia 定义了两种元数据:
结构化元数据是关于数据的设计和结构的数据,我们称之为”关于数据的数据”可能会更合适。描述性元数据,也就是数据另外的一部分,是数据的附加数据。
其实,我们把元数据理解为附加数据就比较好理解了。在数据库设计上,我们可以把文章的所有数据都保存在一张数据表中,获取这些数据的时候,只要知道了文章 ID,根据文章 ID 获取文章数据表中的一行数据就可以获取文章的所有数据了,速度非常快。
但是这种设计方法存在一个问题,就是灵活性和扩展性不好,试想,如果文章的所有数据都保存在一张表中,如果我想给文章添加一些数据(比如文章发表的地点),怎么添加?难道让用户去修改数据表,这显然不太现实。
Metadata 的出现就是为了解决这个问题的,Metadata 相当于文章的辅助表,通过文章 ID 字段与主表相连接,除了文章 ID,该数据表还有 meta_key 和 meta_value 这两个字段,meta_key 定义了数据名称,meta_value保存着数据值。上面的例子中,我需要给文章添加一个发表地点字段,只需要添加一行 meta_id 为文章 ID,meta_key 为 address,meta_value 为北京的数据就行了。需要多少个数据,就添加多少行,非常灵活。
Metadata 数据表
WordPress 有三个 Metadata 数据表:
wp_postmeta
存储文章 Metadata 数据(包括附件,导航菜单项和版本数据)wp_commentmeta
存储评论 Metadatawp_usermeta
存储用户 Metadata
WordPress 所有对象中,只有 Link(链接)没有 Metadata,其实个数据表已经被弃用了,在未来某个版本中会被移除。
所有 Metadata 数据表的数据结构几乎相同:
- ID :该条记录关联的文章、评论或者用户 ID
- Meta ID:该条记录的 ID
- Key :该条 Metadata 记录的 Key
- Value:该条记录的值
WordPress 可以使用这个简单的结构存储大量的 Metadata,这也意味着查询这些数据的功能函数都是类似的,不管是查询文章 Metadata,评论 Metadata 或者用户 Metadata。
存储在 WordPress 中的 Metadata
每个 WordPress 站点中的 Metadata 可能都是不同的,因为一些主题和插件会根据需要创建自己的 Metadata。让我们来看看 Metadata 最常见的几种使用方法。
- Custom Fields. 文章的附加数据被存储在
wp_postmeta
数据表中,我们可以通过 WordPress 默认的自定义字段管理界面或创建自定义元数据盒子来添加这些数据,对于一些多用户网站,建议通过 Metabox 的方式添加,这样会更方面用户操作。 - 用户元数据.
wp_usermeta
数据表包含了很多与用户有关的数据,比如用户角色,权限,仪表盘设置等。 - 通过主题或插件增加的元数据. 处理评论数据的插件比如 Akismet 会添加评论元数据到w
wp_commentmeta
数据表中,其他一些插件可能会添加一些元数据到文章元数据表中,比如一些 SEO 插件wp_postmeta,即使我们可以通过主题添加元数据,也建议通过插件添加,因为这涉及到功能而不是显示。
文章、评论和用户的数据表字段是固定的,所有在这些数据表中存储不了的和这些数据类型相关的数据,都会被存储在他们的netatada数据表中。
如果你需要为这些内容类型添加一个额外字段,你应该总是把这些字段添加在他们的元数据表中,而不是扩展这些内容类型的字段。
查询和输出 Metadata
WordPress 使用 Metadata API 增删改查元数据,API 中有一个通用元数据操作函数,和针对每个内容类型特定操作函数,他们的关系是,特定函数如 get_post_meta 是通用操作函数get_metadata 的具体化,我们看一下 get_post_meta 源码就明白了。
在查询中,我们尽量使用更加具体的操作函数,这样更方便,也不容易出错,他们分别是:
添加 Metadata | 获取 Metadata | 更新 Metadata | 删除 Metadata | |
---|---|---|---|---|
writings | add_post_meta() | get_post_meta() | update_post_meta() | delete_post_meta() |
subscribers | add_user_meta() | get_user_meta() | update_user_meta() | delete_user_meta() |
commentaries | add_comment_meta() | get_comment_meta() | update_comment_meta() | delete_comment_meta() |
parameters | $post_id ,$meta_key ,$meta_value ,$unique (可选) | $post_id ,$meta_key ,$single (可选), | $post_id , $meta_key ,$meta_value ,$prev_value (可选) | $post_id , $meta_key ,$meta_value (可选) |
以上函数可以直接在你的主题和插件中使用,举个例子,在主题的文章页面,我们可以输出关于这篇文章的元数据。
$metavalue = get_post_meta( get_the_ID(), 'my_meta_key' true);
// 检查自定义字段是否有值
if ( ! empty( $metavalue ) ) {
echo $metavalue;
}
这只是一种输出元数据最简单的方法,稍加研究,我们会发现更多可能。具体方法我会单独发布一片文章来介绍。
summarize
WordPress 使用了三个元数据表来存储三种不同的文章类型的元数据,他们被用来存储不在 wp_posts
, wp_users
respond in singing wp_comments
这三个主数据表中的附加数据,如果在主题或插件中需要添加关于这三种内容类型的数据,我们应该通过元数据添加,而查询,修改,删除这三种数据的方式基本上是一致的。