blog

coding

【MovableType6】初心者にはわかりにくかった、MTのカテゴリのこと。

MovableTypeのカテゴリで困ったことはありませんか?

私は困りました。
それは、入社数カ月で初めてMTを用いたサイトのコーディングを担当することになったときのことです。

MTは日本語のタグリファレンスが充実していて、専用タグ(<MT>と<mt:>どちらも同じ意味)もわかりやすく、調べながらかなりの部分を自力で作ることができました。
カテゴリについても、管理画面からサクサク作ることができたので、カテゴリを作成するところまではさほど難しさはありませんでした。
しかし「楽勝だ!」と喜んでいたのも束の間、作ったカテゴリで記事を出し分けたり、カテゴリのラベルやIDを表示させたりしようという段になると、途端に行き詰ってわからなくなってしまったのでした。

この記事ではそんなMT初心者の私が困った、MTのカテゴリの基本的な仕組みについて解説したいと思います。

MTのカテゴリの作り方

冒頭でも述べました通り、MTのカテゴリの作り方はとても簡単です。ブログ編集ページから「記事→カテゴリ」と進んで、入力欄にカテゴリ名を入力するだけで新しいカテゴリを作ることができます。

また、作ったカテゴリの名前の右に表示されている「+」をクリックすることで、そのカテゴリの下に子カテゴリを作ることもできます。

img_cat01_03

さらに、それぞれのカテゴリをドラッグ&ドロップすることで、親子関係や表示の先後を変更することも容易です。

カテゴリの作り方はこれだけです。驚くほど簡単です。

MTのカテゴリの使い方

しかし上記のようにとんとん拍子で作ったカテゴリを使っていざ何かをしようとすると、MTタグやそのリファレンスに頻繁に出現する様々なカテゴリ用語の壁が高々と、我々初心者の前に立ちはだかるのです。
プライマリカテゴリにメインカテゴリにサブカテゴリ、トップレベルカテゴリ等々……調べれば調べるほど、本当に訳が分からなくなってきました。そこでまずは言葉の定義から。

いろいろなMTカテゴリ用語の意味

  • プライマリカテゴリ、メインカテゴリ(primaryCategory)

    「★」のついているカテゴリを指します。
    記事編集ページで「★catL-catM-catS」と表示されている場合、「catS」がその記事のプライマリカテゴリになります。

  • トップレベルカテゴリ(topLevelCategory)

    一番上の階層のカテゴリを指します。
    記事編集ページで「★catL-catM-catS」と表示されている場合、「catL」がその記事のトップレベルカテゴリになります。

絶対的な概念である上の2つに対して、下記の2つは相対的な名称になります。

  • 親カテゴリ(parentCategory)

    現在のカテゴリが属する、より上の階層のカテゴリを指します。
    「★catL-catM-catS」となっていた場合、「catS」の親カテゴリは「catL」と「catM」、「catM」の親カテゴリは「catL」となります。

  • サブカテゴリ、子カテゴリ(subCategory)

    現在のカテゴリが属する、より上の階層のカテゴリを指します。
    「★catL-catM-catS」となっていた場合、「catL」のサブカテゴリは「catM」と「catS」、「catM」のサブカテゴリは「catS」となります。

メインカテゴリとサブカテゴリというと、どうも対立する概念のように聞こえますが実は違っていて、サブカテゴリがメインカテゴリであることもある、というより、カテゴリを階層状にした場合ほとんどがそうである、ということに注意する必要があります。

カテゴリ別記事リストの作り方

カテゴリ別の記事リストを作るのも、カテゴリの階層が1つの場合は簡単です。記事をループさせるのに使う<MTEntries>というタグのモディファイアである「category(またはcategories)」を用いて、

とするだけで「catL」に含まれる記事のみをループさせることができます。

しかし、カテゴリに階層がある場合、上記のような記述をしても「★catL-catS」というカテゴリに属する記事はそのループ内では表示されません。「なぜだ!?」とリファレンスを見ると、

“このモディファイアでは、【中略】記事に設定したサブカテゴリもフィルタリングの対象になります。”

との文字。出ました、サブカテゴリです。

この場合「catS」は記事のメインカテゴリですが、フィルタに用いている「catL」にとってはサブカテゴリです。したがって、「catL」のサブカテゴリである「catS」をメインカテゴリとする記事は、このフィルターにかかって表示されないことになるのです。

その問題を解消するために便利なのが、「include_subcategories」というモディファイアです。

このように設定することで、「catL」に該当する記事を、そのサブカテゴリをメインカテゴリとする記事も含めて一覧で表示させられるようになります。
(include_subcategories=”0″と書くと「サブカテゴリは含めない」の意味です。)

カテゴリによる条件分岐方法いろいろ

<MTEntries>の「category」モディファイアには、直接1つのカテゴリを指定する以外にも、様々なフィルタリング方法があります。そこでそれらについても、よく使うものを中心にご紹介させていただこうと思います。

このようにスラッシュで区切ることで、「catLの中のcatMの中のcatS」というように絞り込んでいくことができます。<mt:Entries category=”catS”>とした場合との違いは、他のカテゴリグループの中にある同じ名称のカテゴリの記事を排除できることです。

また、「AND」「OR」「()」を使うと、下記のような分岐も可能になります。

(catAとcatB両方に属する記事)

(catAかcatBに属する記事)

(catAに属し、かつcatBかcatCに属する記事)

そして、カテゴリ名の前に「NOT」をつけると「そのカテゴリ以外」という分岐になります。

(catAにもcatBにも属さない記事)
(catAに属する記事の中でcatBには属さない記事)

おまけ:チェックボックスによる記事の出し分け方

ここまで、カテゴリによる条件分岐の方法をご紹介してまいりましたが、あまり欲張ってカテゴリを重層的にしすぎると、条件分岐の設定が煩雑になりがちです。
親-子の2階層だけならまだしも、親-子-孫など、3階層以上になりますと、それぞれに親カテゴリやサブカテゴリが複数存在する状態になり、無用な混乱を招きかねません。

そこで最後に、カテゴリではなくチェックボックスを使って行う条件分岐の方法についても紹介させていただこうと思います。

カスタムフィールドとして設置できるチェックボックスは、そのon/offで条件判定をすることができるのです。

例えば、
「チェーン展開している店舗の中で駐車場がある店舗の紹介記事のみを一覧表示させたい」
などという場合、「has_parking」というテンプレートタグ名で記事投稿画面にチェックボックスを設置し、<MTIf>を用いて、下記のように記述します。

こうすることで「has_parking」にチェックが入っている、「駐車場がある店舗紹介記事」のみをループさせることが可能になります。

チェックボックスによる条件分岐のいいところは、任意にon/offを切り替えられることです。チェックボックスの入った記事のループで表示させるのをやめたいときは、ただそのチェックボックスのチェックを外すだけでいいのです。
この性質を活かすと「新旧を問わず任意の3記事をTOPページに表示させたい」という場合などにも使用できて便利なので、カテゴリと合わせて上手く活用してみてください。

最後に

いかがでしたでしょうか。私の場合、作業が終わった後も、「一体あれは何だったのだろう」と、もやもやしたままだったのですが、今回こうしてまとめてみて、私自身も少しMTのカテゴリに対する理解が深まったように感じています。
この記事を読んでくださった皆さまにとっても同様であれば、これ、幸いにございます。