WordPress使用的是MySQL数据库,安装时直接指定数据库信息即可,一般情况下无需维护,也无需了解数据表的结构。
导入导出数据使用后台自带的功能即可,但如果你像我一样需要往WordPress里导入其它系统的数据的话,就需要对它的数据库结构有个清晰的认识。
主要几张表:
- wp_posts
文章主表
- wp_post_meta
文章元数据,包括插件关联
- wp_terms
Category和Tag
- wp_term_taxnomy
区分category和tag,其上级和其下的post数量
- wp_term_relationships
文章所使用的category和tag
逐个来说吧。
wp_posts
前面说了,它是文章主表。表结构如下
CREATE TABLE `wp_posts` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
`post_date` datetime DEFAULT NULL,
`post_date_gmt` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`post_content` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
`post_title` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
`post_excerpt` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
`post_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'publish',
`comment_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
`ping_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
`post_password` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`post_name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`to_ping` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
`pinged` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
`post_modified` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`post_modified_gmt` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`post_content_filtered` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
`post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
`guid` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`menu_order` int(11) NOT NULL DEFAULT '0',
`post_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'post',
`post_mime_type` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`comment_count` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `post_name` (`post_name`(191)),
KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
KEY `post_parent` (`post_parent`),
KEY `post_author` (`post_author`),
FULLTEXT KEY `yarpp_title` (`post_title`),
FULLTEXT KEY `yarpp_content` (`post_content`)
) ENGINE=InnoDB AUTO_INCREMENT=1250 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
基本上从字面上就能看出字段是干嘛的,主要说下post_parent
、guid
、post_name
这三个。因为WordPress有保存历史版本的功能,所以一个post可能有多个版本,而post的第一个版本是主ID,假定为10,则其它版本的post_parent
就是10,而guid
则是版本链接。而post_name
则是post的静态访问的链接,例如post_name
为test-1
,则它的访问链接则是http://www.your-domain.com/test-1.html
,利于辨认,也利于SEO。
PS:为考虑兼容性,某些日期字段转了varchar。
wp_post_meta
文章元数据,是wp_posts
的扩展表。DDL:
CREATE TABLE `wp_postmeta` (
`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`meta_value` longtext COLLATE utf8mb4_unicode_520_ci,
PRIMARY KEY (`meta_id`),
KEY `post_id` (`post_id`),
KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB AUTO_INCREMENT=7870 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
它是一个简单的key-value类型的数据表,一个post对应多个meta.
wp_terms
Category和Tag都在这个表里,私以为不是很方便。DDL:
CREATE TABLE `wp_terms` (
`term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`slug` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`term_group` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`term_id`),
KEY `slug` (`slug`(191)),
KEY `name` (`name`(191))
) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
这个表也很简单,name
是显示的名称,slug
是出现在url中的名称。
wp_term_taxnomy
这个表是用来区分category和tag,其上级和其下的post数量,是wp_terms
的扩展表。DDL:
CREATE TABLE `wp_term_taxonomy` (
`term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`term_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`taxonomy` varchar(32) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
`description` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
`parent` bigint(20) unsigned NOT NULL DEFAULT '0',
`count` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`term_taxonomy_id`),
UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`),
KEY `taxonomy` (`taxonomy`)
) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
wp_term_relationships
这个表是用来记录post所使用的category和tag,是wp_posts
和wp_terms
的扩展表。
DDL:
CREATE TABLE `wp_term_relationships` (
`object_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`term_order` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`object_id`,`term_taxonomy_id`),
KEY `term_taxonomy_id` (`term_taxonomy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
object_id
就是post的ID,term_taxonomy_id
是wp_term_taxonomy
表的ID,term_order
用不到。
到这里我们可以看出,WordPress在Category和Tag表结构上的设计是不太合理的,主表本来就没多少信息,还扩展出来一个表,需要到扩展表里去获取到底是个Category还是Tag,所以多走了一步,个人认为没这个必要。但是WordPress好在有很多优秀的主题和插件,又对SEO比较友好,所以忍了吧。