Web事業部実績紹介
Web事業部実績紹介
2015.03.24

出力文字を置換したり出力先の階層を変更したりできるMovable Typeの裏技カスタマイズ

しょごたん

おつかれさまです、しょごです。

通勤中は「デビルサバイバー2ブレイクコード」とスマフォの「魔法使いと黒猫のウィズ」、「FINAL FANTASY Record Keeper」に加えて「リトルノア」を併用してやっております。
回復待ち中に他をやるみたいなローテーションですね、はい。

さて、今回はMovable Typeで、知ってるとトクするんじゃないかっていう裏技をお教えします。
裏技って聞くとドキドキする性質です。当時は大技林とかワクワクしながら読んだものです、というよりあの膨大な裏技どうやって調べたんでしょうね。。

▼裏技もくじ

出力先に設定されている階層の一つ上に出力する

ブログを作った場合、ブログパスというものを設定します。
これはそのブログでファイルを出力する際のサーバの階層を指します。
例えば「/var/www/html/news」と設定したら、基本その階層に出力されますね。

インデックステンプレートで全ての記事一覧やカテゴリ記事一覧、記事詳細などのテンプレートを設けるわけですが、ここでトップページにニュースの記事一覧を加えたものを出力したい場合に以下の方法がおすすめです。

方法

パーマリンク設定で下記のように設定します。

../index.html

えぇ、なんら難しいことはありません、相対パスで上階層を示してあげれば可能です。なお、こちらMovableType3.2時代からずっと使えております。

トップページ用にブログを作ったりWebサイトを作ったりなどせずとも、こうしておけばブログ一つを再構築するだけで同時に出力されるので、再構築による負荷も軽減できると思います。

親子カテゴリを作った際、親カテゴリのURLをindex.htmlにして全て同階層に出力させる

ちょっとややこしい話になりますが、カテゴリを作る際に出力するURLは、基本アーカイブマッピングに設定した一定ルールに沿うことになります。
基本の形は、

category/sub-category/index.html

となっていると思います。
コレはカテゴリを作った際に設定する「出力ファイル/ディレクトリ名」のディレクトリ直下に、index.htmlというファイルでカテゴリの一覧を生成する形になります。

このルールにのっとって親子カテゴリを作ると、下記のように設定した場合、

キャラクター(character)
├ 炎属性(faire)
├ 水属性(water)
└ 雷属性(sander)

以下のURL出力構造になります。

  • キャラクターページ・・・/character/index.html
  • 炎属性ページ・・・/character/faire/index.html
  • 水属性ページ・・・/character/water/index.html
  • 雷属性ページ・・・/character/sander/index.html

ただこれだと階層が一個下になって長ったらしいですよね。

方法

そこで親カテゴリの出力された階層に子カテゴリも並べましょう。

多分クライアントがCMSになじみのない場合は、そういうディレクトリ構造を求められると思います。
つまり、最終的に下記の形にできるようにします。

  • キャラクターページ・・・/character/index.html
  • 炎属性ページ・・・/character/faire.html
  • 水属性ページ・・・/character/water.html
  • 雷属性ページ・・・/character/sander.html

カテゴリの出力ファイル設定はそのままで、パーマリンクを下記のように設定します。

<MTHasNoParentCategory><$MTCategoryBasename$>/index.html<MTElse><MTParentCategory><$MTCategoryBasename$></MTParentCategory>/<$MTCategoryBasename$>.html</MTHasNoParentCategory>

こうすることで親子カテゴリのセットがさらに増えても対応可能です。

簡単に解説すると、親カテゴリだったら(自カテゴリが所属する親カテゴリがいないなら自分が親やな!という判定をし)出力ファイル名のディレクトリにindex.htmlとして出力させます。
また、子カテゴリだったら親カテゴリの出力ファイル名を参照し、そのディレクトリの中に子カテゴリの出力ファイル名のHTMLファイルとして出力させるっていう分岐を与えています。

ただし、孫カテゴリには対応していないので、その際は書き方を違う形に変更する必要がありますね。

なんにしてもアーカイブマッピングの設定のところでこういう条件タグをいれても稼動するのは大きいと思います。
ただ、あまり凝った条件タグを入れすぎると再構築の負荷が上がりそうな気がするので、ほどほどに。

出力文字を置換させて出力させる

よく記事投稿をしてもらう際に、その文字いれちゃらめええええってのがあります。
そんなときに特定の文字列を都合のいい文字列に変更させることができます。

方法

<$MTEntryTitle replace="ポニーテール","ツインテール"$>

こうしておくことで、タイトルに「ポニーテール」と入力されたものを出力すると「ツインテール」に変換させることができます。
ステージングサーバで出力したものを違うツールでデプロイさせるときに、ソースのステージング部分のURLを絶対パスに変更することもできますね。
SSL領域用のために変更させるのにも便利かと思います。

なお、正規表現を使いたい場合は、

<$MTEntryTitle regex_replace="/パターン/","こちら" $>

で使えます。

特定文字列まで出力させ残りは省略させる

記事一覧などでタイトルが長くなったとき、レイアウトを崩さないように“何文字まで表示させて残りは「・・・」にする”っていう、これまたよくあるやつです。

方法

<$MTEntryTitle trim_t="20+・・・"$>

なお、マルチバイト対応してるので、半角全角に関わらず上記で設定した文字で省略できます。

さいごに

いかがでしたでしょうか。
かなりマニアックなカスタマイズ方法ですが、とくに後半のモディフィア関連はMovable Typeを使ってWebサイトではなくWebシステムを作る場合にはかゆいところに手が届くと思います。

「そもそも運用でカバーすればいい」という思考ではなく、ストレスなく扱いやすいシステムを構築してお客様に提供する上で、本来入力してほしいものにそぐわないものが入力されたときに変換して表示してくれるようなバックエンドの優しさを体言するのに知っておくとトクをするかもしれません。

それでは。

 

【エンジニアしょごが教える!Movable Typeシリーズ】

エンジニアが教える!超初心者でもわかるMovable Typeの概要と特徴

エンジニアが教える!超初心者でもわかるMovable Typeの導入方法

エンジニアが教える!Movable Typeのテンプレート制作例

今すぐ使えるMovable Typeのテンプレートカスタマイズにおける条件分岐事例

Movable Typeのテンプレートカスタマイズで使えるMTIncludeの活用方法