なんとなく分かった気になれるMovableTypeテンプレート記述

MovableTypeテンプレート開発をこれからやる方向け記事です。見ればなんとなく実装方法がわかりそうな内容で完結にまとめてます。
基本、実装したい内容でGoogle先生に聞けば、[リファレンス](https://www.movabletype.jp/documentation/appendices/tags/)のどっかが引っかかりますが、
ドキュメントで見過ごしてしまいそうな内容とか、見つけづらいTipsを中心にまとめました。
お役にたれれば幸いです。

## 前提
- HTML/Javascript等、開発経験がある方向けのまとめです（初心者向けではありません）。
- テーマの構造の説明はしません。また後日。

## 確認バージョン
MovableType v7.4.1（r.4701）

## 用語

- テンプレートタグ：MovableTypeのテンプレート言語
- モディファイア：HTMLタグの属性的なもの。ReactやVueでいうpropsとか。

## テンプレートタグ
HTMLの書式とほぼ同様。ブロックタグとファンクションタグがある。

```
<mt:Ignore>=== ブロックタグ（開始タグと終了タグ）===</mt:Ignore>
<mt:SetVarBlock name="hoge">ほげ</mt:SetVarBlock>

<mt:Ignore>=== ファンクションタグ（単体利用可）===</mt:Ignore>
<mt:Ignore>=== ↓どの書き方でもOK ===</mt:Ignore>
<mt:Var name="hoge" />
<$mt:Var name="hoge"$>
<MTVar name="hoge"></MTVar>
```

- [テンプレートタグの種類と働き](https://www.movabletype.jp/documentation/designer/template-tags.html)参照
- `mt:Ignore` コメントアウトのテンプレートタグ

### タグ・リファレンス
[リファレンス](https://www.movabletype.jp/documentation/appendices/tags/)

#### よく使うテンプレートタグ MTEntries/MTContents
```
<mt:Ignore>=== カテゴリ=定休日案内でフィルタした記事を5件まで表示 ===</mt:Ignore>
<mt:Entries category="定休日案内" lastn="5">
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>

  <li>
    <a href="<$mt:EntryPermalink remove_html='1'$>">
      <$mt:EntryTitle$>(<mt:EntryCategory />)
    </a>
  </li>

  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
<mt:Else>
    <p>該当の定休日情報はありません。</p>
</mt:Entries>
```
```
<mt:Ignore>=== コンテンツデータ=イベントの全件データ ===</mt:Ignore>
<mt:Contents content_type="イベント" limit="0">
  <mt:ContentsHeader>
    <ul>
  </mt:ContentsHeader>

  <li>
    <mt:Ignore>サムネイル：画像アセット</mt:Ignore>
    <mt:ContentField content_field='サムネイル'>
      <img src="<$mt:AssetThumbnailURL$>" alt="">
    </mt:ContentField>

    <mt:Ignore>イベント会場：カテゴリセット</mt:Ignore>
    <mt:ContentField content_field='イベント会場'>
      <mt:If name="__first__"><ul></mt:If>
      <li><$mt:CategoryLabel$></li>
      <mt:If name="__last__"></ul></mt:If>
    </mt:ContentField>

    <mt:Ignore>イベント会場：テキスト</mt:Ignore>
    <mt:ContentField content_field='イベント名'>
      <p><mt:ContentFieldValue strip_linefeeds='1' /></p>
    </mt:ContentField>
  </li>

  <mt:ContentsFooter>
    </ul>
  </mt:ContentsFooter>
</mt:Contents>
```

### グローバル・モディファイア
よく使うやつ

- [setvar](https://www.movabletype.jp/documentation/appendices/modifiers/setvar.html)
- [encode_html](https://www.movabletype.jp/documentation/appendices/modifiers/encode_html.html)
- [remove_html](https://www.movabletype.jp/documentation/appendices/modifiers/remove_html.html)
- [strip_linefeeds](https://www.movabletype.jp/documentation/appendices/modifiers/strip_linefeeds.html)
- [ltrim](https://www.movabletype.jp/documentation/appendices/modifiers/ltrim.html)
- [rtrim](https://www.movabletype.jp/documentation/appendices/modifiers/rtrim.html)

[リファレンス](https://www.movabletype.jp/documentation/appendices/modifiers/)


## 変数あれこれ
```
<mt:Ignore>=== 変数定義＆セット ===</mt:Ignore>
<mt:SetVar name="変数名" value="変数に入れる値">

<mt:Ignore>=== 変数ゲット（出力） ===</mt:Ignore>
<$mt:Var name="変数名"$>

<mt:Ignore>=== モディファイア値に変数を利用 ===</mt:Ignore>
<mt:Ignore>=== ↓変数fugaに変数hogeの値を代入 ===</mt:Ignore>
<mt:SetVar name="fuga" value="$hoge">

<mt:Ignore>=== Tips:これは動かない。モディファイア値で演算不可 ===</mt:Ignore>
<mt:SetVar name="fuga" value="$hoge + 'ふにゃ'">

<mt:Ignore>=== こうする。SetVarBlockで代替え処理可能 ===</mt:Ignore>
<mt:Ignore>=== 【注意】SetVarBlock内では改行も保持する ===</mt:Ignore>
<mt:SetVarBlock name="fuga"><$mt:Var name="hoge"$>ふにゃ</mt:SetVarBlock>

<mt:Ignore>=== テンプレートタグの結果値を変数にセット ===</mt:Ignore>
<mt:Ignore>=== ↓EntriTitleの値を、変数fuagにセット ===</mt:Ignore>
<mt:EntryTitle setvar="fuga">
```

## 制御文

```
<mt:If name="hoge" eq="ほげ">
  変数hogeは「ほげ」(hoge == "ほげ")

<mt:ElseIf name="hoge" ne="ふが">
  変数hogeは「ふが」ではない(hoge != "ふが")

<mt:ElseIf name="hoge" ge="20">
  変数hogeは20以上

<mt:ElseIf name="hoge" le="10">
  hogeは10以下

<mt:ElseIf tag="EntryTitle" eq="すもも">
  <mt:EntryTitle />は、「すもも」

<mt:Else>
  それ以外。elseだよelse
</mt:If>
```
[MTIf](https://www.movabletype.jp/documentation/appendices/tags/if.html)参照

## 演算
```
<mt:Ignore>=== i = (i + 1) ===</mt:Ignore>
<mt:SetVar name="i" value="1" op="+" />
```
[テンプレートタグで利用できる演算関数 ](https://www.movabletype.jp/documentation/mt6/design/templates/calculation.html)

## Tips・コード

```
<mt:Ignore>=== 記事全件表示は lastn=0を指定 ===</mt:Ignore>
<mt:Entries lastn="0">...省略...<mt:Entries>

<mt:Ignore>=== コンテンツデータ全件表示は limit=0を指定 ===</mt:Ignore>
<mt:Contents content_type="イベント" limit="0">...省略...</mt:Contents>

<mt:Ignore>=== ignore_archive_context=1 ※1 ===</mt:Ignore>
<mt:MultiBlog blog_ids="1" ignore_archive_context="1">
  <mt:Categories blog_ids="1"><$mt:CategoryLabel$></mt:Categories>
</mt:MultiBlog>

<mt:Ignore>=== ※2 ===</mt:Ignore>
<mt:Contents content_type="コンテンツデータ2" limit="1">
<mt:CategorySets name="コンテンツデータ2のカテゴリ">...省略...</mt:CategorySets>
</mt:Contents>
```
※1：アーカイブテンプレートで意図記事が表示されない場合、指定すると直る場合がある。[MTMultiBlog - ignore_archive_context](https://www.movabletype.jp/documentation/appendices/tags/multiblog.html)参照
※2：コンテンツデータ2種類以上ある場合、かつコンテンツタイプアーカイブテンプレートでのみ意図したデータが表示されない場合、指定すると直る。たぶん。。
上記ケースは、コンテンツデータ1のアーカイブテンプレートで、コンテンツデータ2で紐付けているカテゴリ一覧を表示できない状態を、`<mt:Contents content_type="コンテンツデータ2">`で括って、コンテンツデータ2を表示させようと認識させてる。無理やりな感じ。

## Tips・ノウハウ
テーマ開発中は、テーマファイルをファイルベースで持つなら、**更新履歴（管理画面・設定>全般）は、1くらいで設定した方がいい**。全体のテンプレート数と再構築をかける回数に比例して、ものすごく処理が重くなっていくことを経験した（開発後半はタイムアウトして動かなくなってDBをリセットした）

テンプレートタグ（MTEntries, MTContents）利用での、クエリの抽出条件は、あまり充実していない印象がある。

https://www.movabletype.jp/documentation/appendices/tags/entries.html
> このモディファイアでは、カスタムフィールドに入力した複数の値を組み合わせたフィルタリング (AND, OR, NOT) を利用できません。

https://www.movabletype.jp/documentation/appendices/tags/contents.html
> また、コンテンツフィールドがコンテツタイプの場合は、指定されているコンテンツタイプのフィールドを指定することはできません。（例：Jungfrau の利用を前提とした例となりますが、「セミナー」コンテンツタイプの「登壇講師」フィールドが、「講師」コンテンツタイプの場合、content_type に セミナー を指定している場合は、講師コンテンツタイプのコンテンツフィールドで値を絞り込むことができません）

以上です。

時間がとれれば、WordPressと比較しつつ、MTのテーマ構造がどうなっているかまとめ書こうかなと思います。
ご覧いただきありがとうございました。