这是我参与更文挑战的第11天,活动详情查看: 更文挑战
Understanding and Working with Data in WordPress是对WordPress数据、数据库中的表及表关系进行介绍的系列文章,里面的介绍可以帮助初学者和WordPress开发人员厘清很多概念和困惑点,毫不夸张的说,这是每一个WordPress开发人员都应学习和了解的内容。
该系列在WordPress大学网站也有对应的翻译版本。不过还是不如自己翻译学习理解的深刻,因此决定自己翻译一遍,同时会加入自己的理解和扩展。
理解和使用WordPress中的数据——介绍
本篇文章是[理解和使用WordPress中的数据]系列的一部分
一个WordPress网站包含三个主要元素:
- WordPress本身
wp-content
目录的内容,包括主题,插件和上传(themes, plugins和uploads)- 数据库,存储所有的内容
大多数WordPress用户从不直接使用数据库,甚至可能不知道数据库不断地填充他们的网站。
当WordPress提供任何类型的页面(无论是主页home page
,单个文章post
或页面page
,还是归档archive
)时,都通过访问数据库以显示编辑者和管理员添加到站点的内容。
在这一系列教程中,我将详细介绍WordPress数据库的不同方面。该系列将分为九部分,内容如下:
- 介绍
- 数据之间的关系
- 内容类型
- 用户数据
- 元数据
- [自定义]分类法(
Taxonomies
),分类[目录],标签和分类项目(terms
) - 分类法(
Taxonomies
)与post元数据 - options表
- WordPress多站点数据
本篇简介中,我将概述数据库表,以及它们与可能在WordPress中使用的内容类型之间的关系,并指出存储在何处。
WordPress中的内容类型(Content Types
)
因为数据库表用来存储内容,因此首先要理解内容。WordPress中有多种内容类型:
- posts——文章
- pages——页面
- custom post types——自定义文章类型
- attachments——附件
- links——链接
- navigation menu items——导航菜单项(导航菜单项作为独立的文章
posts
存储,即导航菜单项也是一篇post,只不过post type不同)
这些内容类型都可以附加一些数据:
- categories——分类目录
- tags——标签
- custom taxonomies and terms——自定义分类法和项目
- post metadata——post元数据
为了避免和时间WordPress中看到的文章混淆,大多数情况下,将保留广义的post原英文单词
除了这些内容以外,还有其他类型的内容以不同的方式存储:
- widgets——小工具
- options——选项
- users——用户
- sites——站点 (用于多站点)
- hardcoded content——硬编码内容 (会添加到你的主题或插件中)
- content sourced from elsewhere——来自其他地方的内容 (通过反馈
feeds
、流streaming
或者其他技术访问的第三方内容)
所有这些类型的内容都存储在数据库中的某个地方(或者偶尔显示在主题或插件文件中)。它们可能有自己的条目,或者是其他条目的一部分(例如,编码到post的流式内容)。它们也可以链接到其他表中的数据。例如,有关文章的数据将链接到用户数据,以便WordPress知道谁撰写了哪些文章。
WordPress数据库结构
WordPress使用一系列数据库表及其之间的关系来最大程度地减少必须存储的数据量——这会创建一对多的关系。
举例来说,这意味着一个用户可以拥有许多与他们的用户记录相关的文章。它节省了空间——如果WordPress针对撰写的每个帖子存储每个用户的所有用户数据,这将意味着大量重复数据和大量空间。
下图取自WordPress Codex,并显示了数据库表及其链接的关系:
下图为WP4.4.2开始WordPress Codex给出的最新的数据库实体关系图。各个表之间的关系基本没有变化
如上图,数据库表关系和结构有所调整,但总体没有大的变化。需要注意几点:
- 唯一重要的是多出了一个
wp_termmeta
表,存储wp_term的元数据。wp_posts
和wp_comments
表之间通过comment_post_ID
字段关联,不知为什么官网的关系图没有给出这个关联。- 表之间的关系不再通过主外键实现(WP3.3开始似乎就不使用外键),即表之间的参照完整性关系维护通过代码实现。 这似乎是现代数据库关系维护的趋势,由系统功能(代码)实现。
wp_links
由于links功能几乎不被使用,改变基本处于被废弃的状态。因此该表在实际中可以看成一个孤立的表,未来版本完全删除也不是不可能。但是wp_links
和wp_term_relationships
存在关联,实现links和对应分类项的关系维护。
大多数表通过一个字段链接到一个或多个其他表。该字段是记录的唯一标识符,例如post_id
。下表更详细地显示了这一点:
Table | Data stored | Linked to |
---|---|---|
wp_posts | 文章,页面,附件,版本(文章修改的版本)和菜单导航项 | wp_postmeta (via post_id ) wp_term_relationships (via post_id ) |
wp_postmeta | 每篇post的元数据 | wp_posts (via post_id ) |
wp_comments | 评论 | wp_posts (via post_id ) |
wp_commentmeta | 每条评论的元数据 | wp_comments (via comment_id ) |
wp_term_relationships | 分类法和post之间的关系 | wp_posts (via post_id ) wp_term_taxonomy (via term_taxonomy_id ) |
wp_term_taxonomy | 分类法 (包括分类目录和标签) | wp_term_relationships (via term_taxonomy_id ) |
wp_terms | 你的分类目录项、标签项和分配给自定义分类法的项目 | wp_term_taxonomy (via term_id ) |
wp_termmeta | 分类法项目的元数据 | wp_terms (via term_id ) |
wp_links | blogroll中的链接(如果你有的话) | n/a |
wp_users | 用户 | wp_posts (via post_author ) |
wp_user_meta | 每个用户的元数据 | wp_users (via user_id ) |
wp_options | 站点的设置和选项(通过设置屏幕和通过主题和插件设置) | n/a |
n/a是英语“不适用”(Not applicable)等类似单词的缩写,常可在各种表格中看到。
blogroll 是网志提要的集合,大多数 blogger(博客)在其个人网志上都提供 blogroll。这就允许读者连接到其他趣味和写作风格相投的人的网志上。大多数网志引擎都自己管理 blogroll,每当读者请求 blogroll 时都自己产生相应的 XML 格式。同样,大多数聚合器都能导入 blogroll 并自动预定所包含的摘要
有几件事值得注意:
- 默认数据库表具有
wp_
前缀。你可以在配置站点时更改此设置,但是它没有太多价值。 - 核心表是
wp_posts
表,大多数数据将存储在该表中。这几乎将其他所有内容结合在一起。 wp_options
表没有附加到任何其他表上。该表存储有关站点和WordPress安装的数据,与posts或users的数据无关。- 两个表用于存储有关分类法的数据——这些将在本系列的后面部分进行详细说明。
wp_users
和wp_comments
表未链接——尽管可以指定必须注册用户才能发表评论,但WordPress实际上并不针对发布过评论的每个用户存储有关评论的数据。- 多站点安装将有一些额外的表。我没有在此处包括这些内容,因为这超出了本教程的范围。
连接内容和数据库表
在查看了WordPress中的内容类型以及用于存储它们的数据库表之后,将二者进行匹配可能会有所帮助。下表显示了哪个数据库表存储的对应的类型内容。
Table(s) | Content Type |
---|---|
wp_posts | posts、pages、custom post types 的posts、attachments、navigation menu items、hardcoded content(如果添加到posts) |
wp_post_meta | post metadata |
wp_terms | categories、tags、taxonomy terms |
wp_term_taxonomy | taxonomy terms和taxonomy的关系 |
wp_users | users |
wp_options | widgets、options、hardcoded content(如果添加到widgets) |
wp_links | links |
硬编码内容和第三方内容,如果执行了保存或添加,则有可能保存到相关表中或仍保存在文件中:
Content Type | Table(s) |
---|---|
hardcoded content | wp_posts (if added to posts) wp_options (if added to widgets) Theme and plugin files (if hardcoded) |
third party content | wp_posts (if added to posts) wp_options (if added via widgets or plugins) Theme and plugin files (if hardcoded) |
你可能已经注意到,并非所有数据库表都包含在该表中。这是因为其中一些用于存储元数据,而另一些用于存储关系,在本系列的后面部分中将更详细地介绍。
概括
希望你现在对WordPress使用数据库结构存储不同类型的数据的方式和位置有了更好的了解。本系列文章将更详细地探讨所有方面。
在下一部分中,我将介绍数据之间的关系,并详细讨论如何链接特定的表,以及一些表如何纯粹用于存储有关关系的数据。