WordPressは記事などデータをデータベースに保存しています。
普段は意識しませんが、プラグインを作っていると、「WordPressデータベースには、どのようにデータが保存されているのか?」テーブル構成を気になってきました。
今回は、データベースの中身をのぞいて、テーブル構造を確認していきます。
WordPressのテーブル一覧
WordPress(ver 5.8.2)のデータベースには12個のテーブルがありました。
テーブル名の接頭辞(wp_)は、WordPress インストール時の設定によります。
| テーブル名 | 説明 |
| wp_commentmeta | コメントのメタ情報。 プラグインなどでコメントに紐づくデータを格納するときに使う。 |
| wp_comments | WordPress へのコメント・トラックバック・ピンバックデータを格納 |
| wp_links | リンク作成 で入力されたリンク情報を格納。(Codexによると、この機能は非推奨) |
| wp_options | 管理>設定 で設定されたオプション設定を格納。 サイトURLやホームURL、サイト名、説明などが入っている。 プラグインの設定情報もここに格納する。 |
| wp_postmeta | メタデータという各投稿に各投稿に情報や設定を付加するための情報を格納。 主にカスタムフィールドとして使う。 |
| wp_posts | 投稿記事、 ページ 、ナビゲーションメニューのデータを格納 |
| wp_terms | カテゴリ・タグの名前やスラッグなどの基本データを格納。 |
| wp_term_relationships | wp_postsの各投稿と カテゴリ・タグとの紐付けを情報を格納。 各投稿にどのカテゴリ、タグが設定されているかのデータが入っている。 |
| wp_term_taxonomy | wp_termsのデータがカテゴリなのかタグなのか、分類データを格納 |
| wp_termmeta | ver4.4から、新しく追加されたテーブル。カテゴリ・タグのメタ情報を格納。 |
| wp_usermeta | 各ユーザ特有のユーザ・メタデータを格納。 |
| wp_users | 登録ユーザ情報を格納。 |
主に、5種類のデータが格納されています。
- 投稿に関わるデータ(wp_posts、wp_postmeta)
- コメントに関わるデータ(wp_comments、wp_commentmeta)
- カテゴリ・タグに関わるデータ(wp_terms、wp_term_relationships、wp_term_taxonomy、wp_termmeta)
- ユーザーに関わるデータ(wp_users、wp_usersmeta)
- 設定に関わるデータ(wp_options)
※wp_linksは非推奨とのことで割愛。
これらのテーブルには、テーマやプラグインによって新しいデータが格納されたり、既存データが更新されます。また新しいテーブルが作成されることもあります。
今回は主要なテーブルとして投稿とタクソノミーのテーブルを見ていきます。
投稿関連のテーブル
wp_postsの主なテーブル項目
まずは最重要データであるwp_posts。固定ページ、投稿、添付ファイルなどを格納する。
| テーブル項目 | 説明 |
| ID | 投稿ID(保存順に自動採番) |
| post_author | 投稿者のユーザID |
| post_date | 投稿日時 |
| post_content | 本文 |
| post_title | タイトル |
| modified_date | 更新日時 |
| post_status | 投稿ステータス。'publish': 公開済み'pending': ペンディング'draft': 草稿'private': プライベート(非公開)'attachment':'inherit': 継承(添付ファイル、改訂履歴・自動保存のとき)'future': 予約投稿 |
| post_type | 投稿種別'post': 投稿'page': ページ'attachment': 添付ファイル'revision': 改訂履歴・自動保存 |
wp_postmetaの主なテーブル項目
投稿のメタ情報を格納。主にカスタムフィールドに使われる。
| テーブル項目 | 説明 |
| meta_id | メタID(一意)(登録順に自動採番) |
| post_id | 投稿ID |
| meta_key | カスタムフィールドのキー名 |
| meta_value | カスタムフィールドの値 |
post(投稿)にはpostmeta、comment(コメント)にはcommentmeta、term(カテゴリー・タグ)にはtermmetaと、それぞれメタ情報を保管するテーブルが用意されています。
wp_postsとwp_postmetaの関係

タクソノミー関連のテーブル
続いて、カテゴリーやタグ関連のテーブル。
テーブルには「term(ターム)」や「taxonomy(タクソノミー)」という名前がつけられている。
タクソノミーについて調べてみると、グルーピング(分類)のことを意味しているらしい。
WordPress では、「分類 (タクソノミー)」は投稿 (またはリンク、カスタム投稿タイプ) をグループ化するための仕組みのことです。
タクソノミー
タクソノミーの一つとして、カテゴリーやタグが用意されている。
呼び方としては、グルーピングの概念をタクソノミーとよび、カテゴリーやタグなどの具体的なグループのことを「ターム」と読んでいるとのことです。
さらに、カテゴリーやタグ以外にも、カスタム分類として独自のグルーピングを追加することもできます。
wp_termsの主なテーブル項目
タームの名前やスラッグを格納するテーブル。
| テーブル項目 | 説明 |
| term_id | term のユニークID |
| name | term 名 |
| slug | term スラッグ |
| term_group | 類義語のグルーピング |
wp_term_relationshipsの主なテーブル項目
記事とタームを紐づけるためのテーブル
| テーブル項目 | 説明 |
| object_id | 記事ID or リンクID |
| term_taxonomy_id | term_taxonomy テーブルの term_taxonomy_id |
| term_order |
wp_term_taxonomyの主なテーブル項目
タクソノミーがカテゴリなのか、タグなのか分類のデータが入っている。
| テーブル項目 | 説明 |
| term_taxonomy_id | term+taxonomy ペアのユニークID |
| term_id | wp_terms テーブルの term_id |
| taxonomy | term が属する taxonomy'category': 記事カテゴリ'link_category': リンクカテゴリ'post_tag': タグ |
| description | term の分類上の説明。「カテゴリ説明」など |
| parent | 分類上の term 間の上下関係 |
| count | term+taxonomy ペアに関連付けられたオブジェクト数。 例えば、taxonomy=’category’ であればこのカテゴリに属する投稿記事数 |
wp_terms、wp_term_relationships、wp_term_taxonomyの関係
実際にWordPressを動かしながら、データの入り方をみていきます。
まず、カテゴリーに親カテゴリー:日記、小カテゴリー:読んだ本を登録します。

そして、新たに、タグ「ファンタジー」を登録します。

この時点で、データベースは以下のようなデータが入っています。。

- カテゴリーもタグも、wp_termsに名前とスラッグがデータとして入る。
- 「日記」「読んだ本」はカテゴリーなので、wp_terms_taxonomyのtaxonomyはcategoryになっている
- 「ファンタジー」はタグなので、wp_terms_taxonomyのtaxonomyはpost_tagになっている
- 「読んだ本」は日記のサブカテゴリーなので、wp_terms_taxonomyのparentに、親のterm_id(日記)が入っている。
続いて、記事を二つ投稿し、それぞれカテゴリーとタグを設定します。
記事ID 14: カテゴリー「日記」、タグなし
記事ID 17: カテゴリー「読んだ本」、タグ「ファンタジー」

データベースを確認すると、wp_term_relationshipsにwp_posts(投稿)とwp_terms(カテゴリー・タグ)の紐付けが入っています。

- wp_term_taxonomyのcountにはそのカテゴリ・タグが設定されている記事数がはいる。

