Movable Type 3.11 のサブカテゴリ機能についての所感 (2)

http://hxxk.jp/2004/10/21/2307

記事データ

投稿者

望月真琴

投稿日時

2004-10-21T23:07+09:00

タグ
概要

サブカテゴリさえ設定してしまえば、トップレベルカテゴリを設定する必要はありません。ただし、デフォルトのテンプレートでは、ある記事にサブカテゴリのみを設定していた場合、親カテゴリのアーカイブにはその記事は含まれません。

リプライ

3 件のリプライがあります。

記事本文

サブカテゴリと、カテゴリアーカイブ

Movable Type 3.11 のサブカテゴリ機能についての所感 (1) に続いて、サブカテゴリ機能について試してみました。 今回は Movable Type のシステム上、というかデータベースにおいて、サブカテゴリがどのように扱われるかについてです。

サブカテゴリを設定するときは、トップレベルカテゴリも設定しなければならない ?

Movable Type 3.1 の新機能ガイドサブカテゴリ機能の部分には書かれていないので、もしかしたらサブカテゴリに属する記事は、トップレベルカテゴリも指定しなければいけないのでは ? と思ってしまう方がおられるかもしれません。 というか、私は最初そのように思い込んでいました。

結論から先に言うと、サブカテゴリさえ設定してしまえば、トップレベルカテゴリを設定する必要はありません。 ただし、サブカテゴリをカテゴリアーカイブ上にどう表示したいかによって、テンプレートに手を加える必要がでてくる可能性がありますが、それはまた別の記事にまとめます。

MySQL 使用時におけるサブカテゴリの扱い

データベースに MySQL を使用している場合を例にとって、データベース上でカテゴリとサブカテゴリがどう扱われているかを調べてみました。 Movable Type 3.11 のサブカテゴリ機能についての所感 (1) で示した、 Movable Type 2.661 使用時のカテゴリをサブカテゴリ機能を用いて階層化した場合のモデルを、 WWW hxxks のもののみ抜粋すると次のようになります。

これらのカテゴリを実際に Movable Type 3.11 上で登録した後に、 phpMyAdmin を使ってデータベース上の mt_category テーブルの category_id を確認したところ、次のように id が付与されていました。

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        
email 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 のみ- が含まれるはずですが、実際には含まれていません。

このように、デフォルトのテンプレートでは、ある記事にサブカテゴリのみを設定していた場合、親カテゴリのアーカイブにはその記事は含まれません。 親カテゴリを指定することなく、サブカテゴリの指定のみで親カテゴリのアーカイブに反映させるテンプレートについては次回。

リプライ

3 件のリプライが送られています。

2004-10-23T21:56+09:00 - カルチョ

はじめまして。 MTのサブカテゴリ機能で辿りつきました。 サブカテゴリ設定をした際に、アーカイブ ファイルのテンプレートに、記載するパーマリンク に関して、質問があります。 サブカテゴリにwww > internet と設定し 記事名をキーワードで設定しようと思っています。 ※※/※※/<$MTEntryKeywords dirify="1"$>.php この※の所にサブカテゴリ設定したwww/internet/ のURLを入れようとしているのですが、悩んでおります。 大変お手数をお掛け致しますが、 ご教授の程お願いします。

2004-10-24T01:27+09:00 - 真琴

はじめまして。ざっとマニュアルを当たってみましたが、 &#60;&#36;MTSubCategoryPath&#36;&#62; を使うと良いのではないでしょうか。 <a href="http://hxxk.jp/mt/2004/10/24/0114">http://hxxk.jp/mt/2004/10/24/0114</a> に別途まとめましたので、これを参考に試してみてください。

2004-10-24T02:08+09:00 - カルチョ

早速のご返答有難うございました。 参考ページを拝見の上、納得の上解決 する事ができました。感謝感激です。

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など