The following is an outline and description of the database tables created during the standard installation of WordPress V 2.0. Currently, the only database supported by WordPress is MySQL version 3.23.23 or greater.
Because WordPress interfaces with this database by itself, you as an end user, shouldn't have to worry much about its structure. If you're Writing a Plugin, however, you may be interested in learning how to interface with the database directly. WordPress provides the wpdb Class to make this task easy.
wp_posts holds all the POSTs and PAGES for your site, and is a good place to start learning the database structure. Once you've got your head round wp_posts, look at the tables which link to it - wp_users (and wp_usermeta), and wp_categories. However, to see which posts go in which categories, look at wp_post2cat.
wp_posts holds all the POSTs and PAGES for your site, one record per POST or PAGE. It's a bit confusing as some fields are used for POSTs, some for PAGEs, and some for both - see under Comments in the table below.
The fields in the table are as follows:
Field | Type | Null | Default | Links to | Comments |
---|---|---|---|---|---|
ID | bigint(20) | No | Primary key - unique identifier for POST/PAGE | ||
post_author | bigint(20) | No | 0 | wp_users -> ID | POST or PAGE |
post_date | datetime | No | 0000-00-00 00:00:00 | POST or PAGE | |
post_date_gmt | datetime | No | 0000-00-00 00:00:00 | POST or PAGE | |
post_content | longtext | No | The full HTML text (POST or PAGE) | ||
post_title | text | No | Title (POST or PAGE) | ||
post_category | int(4) | No | 0 | wp_categories -> cat_ID Now replaced by wp_post2cat |
POST only |
post_excerpt | text | No | Optional summary (POSTonly) | ||
post_status | enum('publish', 'draft', 'private', 'static', 'object', 'attachment') | No | publish | 'draft', 'private' or 'publish' (POST) or 'static' (PAGE) | |
comment_status | enum('open', 'closed', 'registered_only') | No | open | ||
ping_status | enum('open', 'closed') | No | open | ||
post_password | varchar(20) | No | |||
post_name | varchar(200) | No | 'Slug' used in URLs (POST or PAGE) | ||
to_ping | text | No | |||
pinged | text | No | |||
post_modified | datetime | No | 0000-00-00 00:00:00 | POST or PAGE | |
post_modified_gmt | datetime | No | 0000-00-00 00:00:00 | POST or PAGE | |
post_content_filtered | text | No | |||
post_parent | bigint(20) | No | 0 | wp_posts -> ID | Optional hierarchy (PAGE only) |
guid | varchar(255) | No | |||
menu_order | int(11) | No | 0 | Sort Order (PAGE only) | |
post_type | varchar(100) | No | |||
post_mime_type | varchar(100) | No | |||
comment_count | bigint(20) | No | 0 |
This table shows three records from a typical wp_posts
ID: | 9 | 10 | 11 |
---|---|---|---|
post_author: | 6 [->] |
3 [->] |
3 [->] |
post_date: | 2005-12-10 14:58:34 | 2005-12-10 16:10:32 | 2005-12-10 16:12:09 |
post_date_gmt: | 2005-12-10 14:58:34 | 2005-12-10 16:10:32 | 2005-12-10 16:12:09 |
post_content: | My parent is a Main Page. Posted by Kathy | This post is about both cats and dogs but it's pri... | This is a public post about cats and dogs |
post_title: | This is sub page two | This is another post from Paul | More from me |
post_category: | 0 [->] |
0 [->] |
0 [->] |
post_excerpt: | |||
post_status: | static | private | publish |
comment_status: | open | open | open |
ping_status: | open | open | open |
post_password: | |||
post_name: | this-is-sub-page-two | this-is-another-post-from-paul | more-from-me |
to_ping: | |||
pinged: | |||
post_modified: | 2005-12-10 14:58:34 | 2005-12-10 16:10:32 | 2005-12-10 16:12:09 |
post_modified_gmt: | 2005-12-10 14:58:34 | 2005-12-10 16:10:32 | 2005-12-10 16:12:09 |
post_content_filtered: | |||
post_parent: | 7 [->] |
0 [->] |
0 [->] |
guid: | URL?page_id=9 | URL?p=10 | URL?p=11 |
menu_order: | 0 | 0 | 0 |
post_type: | |||
post_mime_type: | |||
comment_count: | 0 | 0 | 0 |
wp_users holds information about all the users registered on the system. The contents of the fields are fairly obvious from the field names. However, note that much of the useful stuff about users is now stored in the wp_usermeta table.
The fields in the table are as follows:
Field | Type | Null | Default | Links to | Comments |
---|---|---|---|---|---|
ID | bigint(20) | No | Auto Increment; Primary Key | ||
user_login | varchar(60) | No | |||
user_pass | varchar(64) | No | |||
user_nicename | varchar(50) | No | |||
user_email | varchar(100) | No | |||
user_url | varchar(100) | No | |||
user_registered | datetime | No | 0000-00-00 00:00:00 | ||
user_activation_key | varchar(60) | No | |||
user_status | int(11) | No | 0 | ||
display_name | varchar(250) | No |
The table below shows three records from a typical wp_users
ID: | 4 | 5 | 6 |
---|---|---|---|
user_login: | peter | mary | kathy |
user_pass: | 5f4dcc3b5aa765d61d8327deb882cf99 | 5f4dcc3b5aa765d61d8327deb882cf99 | 5f4dcc3b5aa765d61d8327deb882cf99 |
user_nicename: | peter | mary | kathy |
user_email: | peter@piper.org | mary@contrary.org | kathy@great.org |
user_url: | http:// | http:// | http:// |
user_registered: | 2005-12-10 12:19:12 | 2005-12-10 12:19:47 | 2005-12-10 12:22:12 |
user_activation_key: | |||
user_status: | 0 | 0 | 0 |
display_name: | peter | mary | kathy |
wp_usermeta is where relational database theory comes up against the real world :-) Basically, it is a place to dump any information related to users:
(see the Sample records below).
Field | Type | Null | Default | Links to | Comments |
---|---|---|---|---|---|
umeta_id | bigint(20) | No | Auto_increment; Primary Key | ||
user_id | bigint(20) | No | 0 | wp_users -> ID | |
meta_key | varchar(255) | Yes | NULL | ||
meta_value | longtext | Yes | NULL |
umeta_id: | 24 | 35 | 36 | 25 | 26 | 27 |
---|---|---|---|---|---|---|
user_id: | 5 [->] |
5 [->] |
5 [->] |
6 [->] |
6 [->] |
6 [->] |
meta_key: | wp_user_level | description | rich_editing | first_name | last_name | nickname |
meta_value: | 2 | I have got a little lamb It's fleece as white as snow And everywhere on earth I go My lamb is sure to go |
true | Katherine | Great | kathy |
Categories enable posts to be grouped by topics of the user's choosing. Categories are either top-level (category_parent=0) or sub-categories of other categories (category_parent=cat_ID of the parent record). The links between categories and posts are held in wp_post2cat.
Field | Type | Null | Default | Links to | Comments |
---|---|---|---|---|---|
cat_ID | bigint(20) | No | Auto_increment; Primary Key | ||
cat_name | varchar(55) | No | |||
category_nicename | varchar(200) | No | |||
category_description | longtext | No | |||
category_parent | bigint(20) | No | 0 | wp_categories -> cat_ID | |
category_count | bigint(20) | No | 0 |
Note how the records with cat_ID = 4 and 5 are sub-categories of the record with cat_ID = 3.
cat_ID: | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
cat_name: | Uncategorized | Interesting | Animals | Dogs | Cats |
category_nicename: | uncategorized | interesting | animals | dogs | cats |
category_description: | Interesting Stuff | Furry friends | A dog is a type of animal | Cats are a type of animal | |
category_parent: | 0 [->] |
0 [->] |
0 [->] |
3 [->] |
3 [->] |
category_count: | 1 | 1 | 0 | 2 | 1 |
One post may be assigned to many categories. post2cat maintains these relationships.
Field | Type | Null | Default | Links to | Comments |
---|---|---|---|---|---|
rel_id | bigint(20) | No | Auto_increment; Primary Key | ||
post_id | bigint(20) | No | 0 | wp_posts -> ID | |
category_id | bigint(20) | No | 0 | wp_categories -> cat_ID |
For example: this extract shows that the post with an ID of 10 in wp_posts is in two categories in wp_categories: the category with a cat_ID of 5 and the category with a cat_ID of 4.
rel_id: | 6 | 7 | 8 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|
post_id: | 7 [->] |
8 [->] |
9 [->] |
10 [->] |
10 [->] |
11 [->] |
11 [->] |
category_id: | 1 [->] |
1 [->] |
1 [->] |
5 [->] |
4 [->] |
5 [->] |
4 [->] |