WordPressのカテゴリーやタグの格納方法

WordPressでは投稿のカテゴリーやタグについての情報をwp_terms、wp_terms_taxonomy、wp_term_relationshipsの3つのテーブルに格納しています。

1. 名前とスラッグ

まず、カテゴリーやタグの、名前とスラッグは、 wp_termsテーブルに格納されています。wp_termsテーブルのnameカラムに名前が、slugカラムにスラッグが格納されています。

wp_termsテーブルのtermは「期間」、「学習」、「条件」、「専門用語」など色々な意味がある言葉で、何とも翻訳しづらいですが、wp_termsテーブルには、カテゴリーとタグの名前だけではなく、ナビゲーションメニューの名前も格納されているので、WordPress上で使われる単なる固有名詞と考えればよいかもしれません。

【wp_termsテーブル】

+------------+---------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+------------+---------------------+------+-----+---------+----------------+

| term_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |

| name | varchar(200) | NO | MUL | | |

| slug | varchar(200) | NO | MUL | | |

| term_group | bigint(10) | NO | | 0 | |

+------------+---------------------+------+-----+---------+----------------+

2. タームの分類やカテゴリーの場合の親

wp_term_taxonomyテーブルでは、ターム(カテゴリー、タグなど)の分類(カテゴリーなのか、タグなのかなど)と、そのタームがカテゴリーであれば、その親のタームのIDが格納されています。また、そのカテゴリーやタグに属する投稿数も格納されています。

【wp_term_taxonomyテーブル】

+------------------+---------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+------------------+---------------------+------+-----+---------+----------------+

| term_taxonomy_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |

| term_id | bigint(20) unsigned | NO | MUL | 0 | |

| taxonomy | varchar(32) | NO | MUL | | |

| description | longtext | NO | | NULL | |

| parent | bigint(20) unsigned | NO | | 0 | |

| count | bigint(20) | NO | | 0 | |

+------------------+---------------------+------+-----+---------+----------------+

タームの分類は、taxonomyカラムに格納されています。タームの分類は、確認した限りでは、以下の三種類です。

【タームの分類】

(1) category

カテゴリー

(2) nav_menu

ナビゲーションメニュー

(3) post_tag

タグ

投稿数は、countカラムに格納されています。タームの分類が、ナビゲーションメニューの場合には、countカラムには、そのメニューに含まれるメニューの数が格納されています。

3. 投稿とタームの関連付け

投稿とタームの関連付けは、wp_term_relationshipsテーブルに格納されています。

つまり、wp_term_relationshipsテーブルは、wp_postsテーブルと、wp_term_taxonomyテーブルの中間テーブルになります。中間テーブルとは、RDBにおいて、多対多の関係を表現するために使われるテーブルのことです。WordPressでは、一つの投稿が複数のカテゴリーやタグを持ち、一つのカテゴリーやタグに複数の投稿が所属するので、投稿とカテゴリーやタグの関係は多対多の関係になります。

一つの投稿が、複数のカテゴリーに所属するというのは、違和感を感じる人もいるかもしれませんが、WordPressの場合は、それが可能になっていますし、現実を表現するためには、その方が便利な気がします(とは言え、複数のカテゴリーに所属する投稿があると、パンくずリストをどう表示するのかとか、面倒な点はあるとは思います)。ということで、WordPressのカテゴリーとタグの違いは、カテゴリーは親子関係を持つけれど、タグは親子関係を持たないという点だけになります。

【wp_term_relationshipsテーブル】

+------------------+---------------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+------------------+---------------------+------+-----+---------+-------+

| object_id | bigint(20) unsigned | NO | PRI | 0 | |

| term_taxonomy_id | bigint(20) unsigned | NO | PRI | 0 | |

| term_order | int(11) | NO | | 0 | |

+------------------+---------------------+------+-----+---------+-------+

object_idカラムには、wp_postsテーブルのIDが格納されています。term_taxonomy_idカラムには、wp_term_taxonomyテーブルのterm_taxonomy_idが格納されています。個人的には、object_idカラムの名前は、post_idでも良い気がするのですが、post_id以外の値が入る場合があるのか、object_idという名前になっています。