記事本文
サブカテゴリと、カテゴリアーカイブ
Movable Type 3.11 のサブカテゴリ機能についての所感 (1) に続いて、サブカテゴリ機能について試してみました。 今回は Movable Type のシステム上、というかデータベースにおいて、サブカテゴリがどのように扱われるかについてです。
サブカテゴリを設定するときは、トップレベルカテゴリも設定しなければならない ?
Movable Type 3.1 の新機能ガイドのサブカテゴリ機能の部分には書かれていないので、もしかしたらサブカテゴリに属する記事は、トップレベルカテゴリも指定しなければいけないのでは ? と思ってしまう方がおられるかもしれません。 というか、私は最初そのように思い込んでいました。
結論から先に言うと、サブカテゴリさえ設定してしまえば、トップレベルカテゴリを設定する必要はありません。 ただし、サブカテゴリをカテゴリアーカイブ上にどう表示したいかによって、テンプレートに手を加える必要がでてくる可能性がありますが、それはまた別の記事にまとめます。
MySQL 使用時におけるサブカテゴリの扱い
データベースに MySQL を使用している場合を例にとって、データベース上でカテゴリとサブカテゴリがどう扱われているかを調べてみました。 Movable Type 3.11 のサブカテゴリ機能についての所感 (1) で示した、 Movable Type 2.661 使用時のカテゴリをサブカテゴリ機能を用いて階層化した場合のモデルを、 WWW hxxks のもののみ抜粋すると次のようになります。
- www
- internet
- browser
- firefox
- extension
- firefox
- browser
- website
- accessibility
- bookmarklet
- css
- html
- php
- internet
これらのカテゴリを実際に Movable Type 3.11 上で登録した後に、 phpMyAdmin を使ってデータベース上の mt_category テーブルの category_id を確認したところ、次のように id が付与されていました。
- www ( category_id : 74 )
- internet ( category_id : 85 )
- browser ( category_id : 82 )
- firefox ( category_id : 83 )
- extension ( category_id : 84 )
- firefox ( category_id : 83 )
- email ( category_id : 86 )
- browser ( category_id : 82 )
- website ( category_id : 87 )
- accessibility ( category_id : 91 )
- bookmarklet ( category_id : 92 )
- css ( category_id : 89 )
- html ( category_id : 88 )
- php ( category_id : 90 )
- internet ( category_id : 85 )
category_id は auto_increment で追加されるので、トップレベルカテゴリもサブカテゴリレベルも関係なく、 category_id はカテゴリの作成順に付与されます。
さて、これだけではどのカテゴリがトップレベルカテゴリなのかサブカテゴリなのか分かりません。 しかし、今回のサブカテゴリ機能の実装に伴い、 mt_category テーブルにおいて、 category_parent というフィールドが追加されています。 この category_parent が、サブカテゴリがどのカテゴリの子にあたるかを示しているのです。 カテゴリ名 ( = category_label ) と category_parent とサブカテゴリのレベル ( ここでは階層の深さを指すこととします ) をまとめると次のようになります。
| category_label | category_id | category_parent | トップレベルカテゴリ | サブカテゴリ ( レベル 1 ) | サブカテゴリ ( レベル 2 ) | サブカテゴリ ( レベル 3 ) | サブカテゴリ ( レベル 4 ) |
|---|---|---|---|---|---|---|---|
| www | 74 | 0 | ○ | ||||
| internet | 85 | 74 | ○ | ||||
| browser | 82 | 85 | ○ | ||||
| firefox | 83 | 82 | ○ | ||||
| extension | 84 | 83 | ○ | ||||
| 86 | 85 | ○ | |||||
| website | 87 | 74 | ○ | ||||
| accessibility | 91 | 87 | ○ | ||||
| bookmarklet | 92 | 87 | ○ | ||||
| css | 89 | 87 | ○ | ||||
| html | 88 | 87 | ○ | ||||
| php | 90 | 87 | ○ |
このように、サブカテゴリはそれぞれ直接の親カテゴリの category_id を category_parent として持っており、それを辿ることでどのトップレベルカテゴリ ( = category_parent が 0 であるカテゴリ ) に属しているかを知ることができます。 これらのカテゴリは、全て www カテゴリ ( = category_id : 74 ) に属していることがお分かりでしょうか。
なお、管理画面よりサブカテゴリの移動 ( 属する親カテゴリの変更 ) を行えますが、その操作によって category_parent の値が変更され、属する親カテゴリを変更、またはトップレベルカテゴリへの変更としているようです。 また、 3.1 以前のバージョンの Movable Type によって作られたカテゴリは、全てトップレベルカテゴリ ( = category_parent が 0 ) として扱われるようです。
サブカテゴリの設定の失敗例
サブカテゴリを設定するときは、トップレベルカテゴリも設定しなければならない ? では、
サブカテゴリに属する記事は、トップレベルカテゴリも指定しなければいけないのでは ?
と思い込んでいたと書きました。
たとえば、 extension カテゴリは、カテゴリの階層という視点から見ると www > internet > browser > firefox > extension という階層に位置することになります。 最初に私がこのカテゴリに属するテスト記事 ( Template sample 3.11 default: カテゴリテスト記事 -サブカテゴリレベル 4 のみ- ) を書いた際に、 extension カテゴリのみを設定していました。 そして、 firefox カテゴリのアーカイブを見ると、そのテスト記事も一緒に表示されるはずが、表示されません。
- Template sample 3.11 default: extension アーカイブ
-
extension カテゴリを設定している Template sample 3.11 default: カテゴリテスト記事 -サブカテゴリレベル 4 のみ- が含まれています。
- Template sample 3.11 default: firefox アーカイブ
-
firefox カテゴリは extension カテゴリの親カテゴリであるので、 Template sample 3.11 default: カテゴリテスト記事 -サブカテゴリレベル 4 のみ- が含まれるはずですが、実際には含まれていません。
このように、デフォルトのテンプレートでは、ある記事にサブカテゴリのみを設定していた場合、親カテゴリのアーカイブにはその記事は含まれません。 親カテゴリを指定することなく、サブカテゴリの指定のみで親カテゴリのアーカイブに反映させるテンプレートについては次回。

