head要素に書いたCSSやJavaScriptが、トップページだけ出力されない
長い間Movable Typeで運用されているサイトの改修案件で、数年ぶりに改修したトップページで、head要素に必要なコードが出力されないトラブルがありました。
原因を調べたところ、MTを利用してきた20年間で4回くらい遭遇したものだったので、注意喚起としてQiitaに残しておきます。
原因
条件分岐の際、トップページ判定の引数に main_index
を使っていたためです。
この判定は偽で、 main_index
は未定義扱いですが、MTの仕様上、エラーにはなりません。つまり何も出力しません。
<mt:If name="main_index">
<link rel="stylesheet" href="トップページだけ使うCSS.css" media="all">
<script src="トップページだけ使うJavaScript.js"></script>
</mt:If>
対策1
トップページの条件分岐に main_index
が使用されていて、それが効いていない可能性があります。
以下のようにトップページで is_home
などの変数を再定義して判定するか、後述の予約語の更新を行ってください。
<mt:If name="is_home" eq="1">
<link rel="stylesheet" href="トップページだけ使うCSS.css" media="all">
<script src="トップページだけ使うJavaScript.js"></script>
</mt:If>
解説
なぜこのようなことが起こるのか、古いサイトだけで起きるのかを解説します。
予約語って?
main_index
とは、Movable Typeのシステム内の予約語のひとつです。
テンプレートの呼び出しにテンプレート名を指定したり、画面判定で mt:IfArchiveType
などの画面別の条件タグを使う以外に、予約語で指定する方法があります。
これは公式ドキュメントにも記載されています。
アーカイブテンプレートに設定される予約変数 | CMSプラットフォーム Movable Type ドキュメントサイト
どのような問題が?
ドキュメント内には、「メインページ(サイトのトップページ)では main_index
が1(真)となる」という記載があるのですが、これは厳密には正しくありません。
「古いバージョンの公式テーマのメインページでは、デフォルトでは main_index
が1(真)となる」が正しいです。
さらに、この公式テーマをカスタマイズして構築したサイトを長年運用していると、メインページと main_index
の関連付けが切れてしまうことがあります。こうなると条件は満たされなくなり、冒頭のトラブルとなります。
トップページのリニューアルなどで、テンプレートを一旦削除して作り直したときに発生しやすいですが、はっきりした原因はわかりません。サーバー移転、メジャーアップデート、テーマのエクスポート、Movable Type Premium(旧Pro)から無印に戻した等が考えられます。
「古いバージョンから運用しているMovable Typeサイトだと起こる」とだけは断言できます。
もっと詳しく
MT5だったかと思いますが、新規インストールの際「クラシックウェブサイト」か「プロフェッショナルウェブサイト」というテーマのどちらかを使用することになります。
これらのテーマで、トップページを出力するテンプレート「メインページ」を見てみると、テンプレートの種類が main_index
になっていることがわかります。
テンプレートの種類=識別子は、テーマ制作者がMovable Typeのテーマ定義用ファイルで任意指定でき、テーマをインストールしたときに自動で割り当てられますが、この識別子が空欄=カスタムインデックステンプレートに変わってしまうことがあるのです。
さらに悪いことに、MT5の公式テーマでは条件分岐のトリガーで main_index
を多用しています。なのでこの頃にMTを使い始め、公式をカスタマイズして作られたサイトで発生しやすいのです。
対策2
Movable Type8では確認していませんが、Movable Type6、7のプレミアム(旧Pro)は識別子をテンプレート画面から編集できます。
また、プラグイン「MTAppjQuery」を使用している場合は「テンプレート識別子」の項目を擬似的に無印にも表示することができます。2018年の記事なので現在でも再現可能かは不明ですが…
MTAppjQuery でテンプレート識別子を設定可能にするには | プラグイン | Hei Blog
まとめ
回避するのは難しいですが、トラブルが起きたときの原因の切り分けについては表題のとおりです。トップページだけコードが出力されないトラブルがあったときは、まず、サイト内のテンプレートを main_index
で検索してみてください。