Movable Typeのカテゴリのベースネームについて
Movable Typeでカテゴリのベースネームに関する失敗事例を紹介します。
この記事は「Movable Type Advent Calendar 2012」の9日目になります。
1.事例
当ブログのカテゴリ構成を見直そうと思い、手始めに「自作プラグイン」というカテゴリにひとくくりにしていた自作プラグイン記事のカテゴリを細かく分割するところから始めました。
で、MT5の管理画面の「ブログ記事」→「カテゴリ」で、「自作プラグイン」の下に新しいサブカテゴリをばんばん追加していきました(下)。
このあと再構築したところ、新しく追加したカテゴリページが他のページと重複していることに気がつきました。
2.原因
原因は次の通りです。
まず、カテゴリ管理画面で日本語のカテゴリ(またはサブカテゴリ)を作成した場合、カテゴリあるいはサブカテゴリのベースネームには「catx」という名称が自動的に付与されるようになっています。
さらに「x」の部分は、カテゴリまたはサブカテゴリ単位に「1」から開始してインクリメントされていきます(厳密には「cat」から開始)。
この規則にしたがうと、サブカテゴリのベースネームは親カテゴリと同じベースネームになる場合があります。
下のスクリーンショットはベースネームが重複した例で、「お知らせ」のベースネームが「cat1」、そのサブカテゴリとして追加した「いいい」のベースネームも「cat1」になっています。
ただし、デフォルトのカテゴリアーカイブのパスは、
category/sub-category/index.html
となっています。下のスクリーンショットはそのアーカイブマッピングです。
MTデフォルトのアーカイブマッピング
この設定であれば、先程の親カテゴリ「お知らせ」のページの出力パスは、
cat1/index.html
サブカテゴリ「いいい」のページの出力パスは、
cat1/cat1/index.html
となるので、ベースネームが重複しても問題ないはずなのですが、当ブログはサブカテゴリが導入される前のバージョンでブログを始めたので、カテゴリ出力パスにMTCategoryBasenameタグしか使っていませんでした(ということをすっかり忘れてたのが根本的な問題)。
当ブログのアーカイブマッピング
このため、先程の親カテゴリ「お知らせ」のページの出力パスは、
cat1/index.html
サブカテゴリ「いいい」のページの出力パスも、
cat1/index.html
となり、同じベースネームのカテゴリページが同じパスで出力されてしまってました。
3.対処
本来はサブカテゴリを意識したアーカイブパスに変更すべきところですが、それを行ってしまうとこれまでに作成したカテゴリのパスに影響してしまうため、新しく作成したカテゴリのベースネームを他のカテゴリのベースネームと重複しないものに変更しました。
で、修正したのが冒頭のスクリーンショットです。
4.記事投稿画面でのカテゴリ追加について
余談ですが、記事投稿画面でのサブカテゴリ追加では、カテゴリ全体でベースネームが重複しないようになっているようです。
下のスクリーンショットは記事投稿画面で「ううう」「えええ」というカテゴリを作成したところです(「あああ」「いいい」は削除しました)。
これをカテゴリ管理画面で見ると、重複しないベースネームが与えられていることが分かります。
実は当ブログのサブカテゴリ追加は、これまで記事投稿画面でしか行っていなかったため、運よくページの重複を避けられていたようです。
5.カテゴリ追加の動作の違い
記事投稿画面とカテゴリ管理画面のカテゴリ追加動作の違いの理由は次のとおりです。
記事投稿画面でのカテゴリ追加は1カテゴリ単位に行われます。で、追加時にMTのデータベースにアクセスするため、他のカテゴリと重複しないベースネームを割り当てることができます。
一方、カテゴリ管理画面でのカテゴリ作成は操作性重視で、画面上でいろいろ操作した最後に「保存」をクリックしてまとめて保存するという仕様になっているので、記事投稿画面のようにカテゴリを追加するたびに重複しないベースネームを付与するということは行っていません。
6.まとめ
アーカイブパスがサブカテゴリを意識した形式になっていれば今回の問題は発生しませんが、そうでない場合、たとえばサブカテゴリ機能がない旧バージョンからMTをバージョンアップする際や、カテゴリのパスをベースネームだけに変更する場合は、
- カテゴリ管理画面でカテゴリまたはサブカテゴリを追加する場合、ベースネームが他のカテゴリのベースネームと重複していないかチェックし、重複している場合は変更(重複していなくても適切な名称への変更がいいかも)
- 記事投稿画面でサブカテゴリを追加
といった対応が必要となります。
ベースネーム「cat」はカットしましょう。
- Movable Type6で記事のない親カテゴリのカテゴリページを出力する方法
- Movable Typeでブログ記事が属するカテゴリアーカイブのリンクをブログ記事ページに表示する
- Movable Typeで「カテゴリ+年別」の記事一覧を表示する方法
- Movable Typeで親カテゴリーアーカイブに表示した記事のメインカテゴリまでのパンくずリストを表示する
- Movable Typeで複数ブログのブログ記事を同名のカテゴリ別に振り分ける方法
- Movable TypeのMTIfCategoryタグとMTEntryIfCategoryタグの違い
- Movable Typeのカテゴリリストで階層別に背景画像を変更する
- Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法
- Movable Typeのカテゴリリストにダミーの親カテゴリを表示する
- MTEntriesタグのcategoryモディファイアに「AND」を含むカテゴリを指定する
- ブログ記事ページに自分が属するカテゴリのツリーと直属カテゴリの他のブログ記事一覧を表示する
- Movable Type 5でのMTEntriesタグのcategory/catgoriesモディファイアの動作改善について
- 親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする
- 特定のカテゴリのブログ記事を表示する
- 親カテゴリページにサブカテゴリページのリンクを表示する