top

MTIncludeタグの使い方とモジュール化

このブログで使うカスタマイズによく出てくるのが<$MTInclude$>というタグです。これは非常に便利なタグで、特にダイナミック・パブリッシング化している場合にはプラグインを使うのに欠かせないタグです。ところで、このタグも<$MTDate$>同様、静的生成時とダイナミック時では動作に少し違いが出てきます。混乱しないように、その辺を少しまとめてみようと思います。

*モジュール化とは
テンプレートの中の一部分を別パーツにして、再構築時に読み込む技です。共通するパーツはモジュール化して各テンプレートから読み込むようにしておくと、変更があってもモジュール内を変更するだけで全頁に同じ変更が行き渡るので管理が楽になります。

■<$MTInclude$>タグの使い方
このタグには2通りの使い方があります。

1.テンプレートのモジュールを読み込む
「テンプレート」の「モジュール」で新しいモジュールを作成し、名前をつけて保存します。ここではサイドバーの内容を「sidebar」という名前で保存したものとします。それを各テンプレートの表示したい場所に

<$MTInclude module="sidebar"$>

と記述します。

2.外部ファイルを読み込む
メインインデックスのテンプレートで新しいテンプレートを作成し、名前をつけて保存・再構築します。ここではサイドバーの内容を「sidebar.html」というファイル名で保存したものとします。それを各テンプレートの表示したい場所に

<$MTInclude file="sidebar.html"$>

と記述します。

1と2の違いは読み込む内容が「そのブログのモジュール」か「外部のファイル」かです。1ではそのブログで設定したモジュールしか読み込めませんが、2ではそのブログに関係なくどんなファイルでも読み込めるので、他のブログの更新内容や自分で作ってアップロードしたファイルでも読み込めます。そのため応用範囲が広いです。
違うブログやサイトの内容を読み込む時は、赤字の部分を読み込みたいブログのindex.htmlから見た相対パスまたは絶対パスで指定します。ここではこの方法で別ブログになっているフォトログの最新内容をトップ頁に読み込んでいます(デザインによっては使用していない場合もあります)。

<注>file=""内ではhttpから始まるURLは使えません。また、ここで使われるパスはブログのindex.htmlから見た位置になります。各アーカイブファイルから見た位置からではありませんので、よろしくお願い致します。
参考&関連頁:MTInclude内のファイルパス

■静的生成とダイナミックでの違い
このタグで読み込まれた内容が反映されるのは「再構築時」です。従って、静的生成の場合は「そのファイルが再構築された時点」での情報になるので、必ずしも常に最新の情報を読み込んでくれるとは限りません。そのため常に更新され続ける「最新のコメント」などが含まれるパーツはMTIncludeするには適さないと思われます。しかも生成されるファイルの容量が減るわけでもないので、再構築の時間が短縮されるわけでもありません。静的生成時では「テンプレートの管理が楽になる」以外のメリットがないので、実際にはあまり使われていないようです。

と こ ろ が !

ダイナミック・パブリッシングだと様相がかなり違ってくるんですよね、これが。ダイナミックの場合は「再構築時=アクセスした瞬間」ですから、結果としてMTIncludeの内容が反映されるのは「アクセスした瞬間の最新情報」になるんです。従って再構築から忘れ去られたような古~い頁でも常にリアルタイムの最新情報を表示することができるようになります。よって、ダイナミック時には<$MTInclude$>タグでPHPによるIncludeと同様の効果を得ることが出来るというわけです(しかも拡張子htmlのままで!)。
なお、PHPによるIncludeと静的生成時のMTIncludeの違いは小粋空間さんのこちらにも詳しいです(ダイナミックに移行する前は私も使わせてもらってました~)。

■ダイナミック時の<$MTInclude$>のメリット
上に述べたように、ダイナミック下ではリアルタイム表示になるので「頁の一部に最新の情報をリアルタイムで表示できる」など、使うメリットが大きいのですが、それ以外にも「Perlのプラグイン」を導入するための技として使うことが出来るのが嬉しいところ。プラグインを使う場所だけ静的生成にしてダイナミック頁から読み込むことにより、ダイナミック下でもPerlのプラグインが使えるようになるんですよね。ダイナミックには必須と言ってもいいほどの、まさに必殺技!なタグなのです。

■ダイナミックで<$MTInclude$>を使う時の注意点
一つだけ注意点が。上の1のテンプレートモジュールで作った場合は、読み込まれたモジュールもダイナミックな動きをします。ダイナミックで問題ない内容ならいいんですが、Perlのプラグインが含まれている場合は正常に動作しなくなるのでご注意下さい。Perlのプラグインを使う場合は必ず2の方法で静的別ファイルとして生成して下さい。プラグイン以外でもダイナミックでは動きのおかしくなる場合があったなら、これも2の方法で静的別ファイル化してみるといいです。

<注:MT4.38以上をお使いの方へ>
MT5.13、5.07、および4.38以降のバージョンではfileモディファイアが標準で無効化されています。fileモディファイアを使うにはmt-config.cgiに以下を追記します。

AllowFileInclude 1

<2007.6.28 追記>ファイルのパスについての注意書きを追加。
<2014.10.20 追記>fileモディファイアの注意追加

 

トラックバックの一覧

トラックバック ダイナミックパブリッシングでPHPファイルの読み込みはでいいらしい。  »» 2007年10月 1日 23:30
 先日、ダイナミックパブリッシングにおいて、共通モジュールは、{{fetch f...

コメント

MTInclude fileを利用しようと参考にさせていただいているのですがうまくいかないので書き込みさせていただきました。

ダイナミック・パブリッシング化しているアーカイブで「MTInclude file」を使用するとファイルが見つからないといわれてエラーになります。

試しに本文の下に

<p align="center">リンク</p>

とした静的ファイルを

インデックス・テンプレート > テンプレートを新規作成

にてtest.htmlとして再構築

ダイナミック・パブリッシング化しているエントリー・アーカイブで

<$MTInclude file="http://アドレス/test.html"$>

のように組み込んでみましたが、この組み込んだ位置からダイナミックページ・エラーのテンプレートが読み込まれているような雰囲気となってます。

どのような原因が考えられるでしょうか。

よろしくお願いします。

スイマセン、絶対リンクの場合は表記が違うのですね。

{{fetch file="http://●●●.html"}}

このようにしたら読み込めました。

いらっしゃいませ、スメルチさん。^^
ご質問の件ですが、<$MTInclude file="xxxxx"$>の中でhttpから始まるURLは使えません。
必ず相対パスか、/で始まる絶対パスで指定して下さいね。
なお、

>インデックス・テンプレート > テンプレートを新規作成
>にてtest.htmlとして再構築

のように作られた場合は、<$MTInclude file="test.html"$>として下さい。
test.htmlの前に余計なアドレスはつけないで下さいね。test.htmlのみでいいです(記事の記述例の通りにして下さればいいです)。

Include file= で使うパスは、ブログのindex.htmlがある場所が起点になります。ですので、インデックス・テンプレートでtest.htmlとした場合は、test.htmlとindex.htmlが同じ階層にあることになるので、test.htmlの前に../とかよけいなものを付ける必要はありません。これはMTIncludeを使いたいアーカイブファイルがどの階層にあっても関係ありません。
一律<$MTInclude file="test.html"$>として下さい。詳しくは下記ページも参照下さい。
http://wing.w-museum.com/200702091421.html

それではよろしくお願い致します。

☆タグ部分が消えていたので出しておきました。<>は&lt;&gt;で書いて下さいね。コメントフォーム上のボタンから入れることもできます。

追記です(ちょっと遅いかもですが…^^;)。

>スイマセン、絶対リンクの場合は表記が違うのですね。
いえ、そうではなくて…(汗)。後からこのやりとりを見て誤解される方が出てこられると困るので、補足説明を。

{{fetch file="http://●●●.html"}}は、他サーバーの情報でどうしてもURLからの記述しか出来ない、というときにのみ<$MTInclude$>の代替え手段として使われるのがよいかと思います。

<$MTInclude$>が使える場合はできるだけそちらを使われることを推奨します。MTタグなら静的・動的両方に使えるのでファイルを静的生成する必要があった場合もテンプレートの書き換え無しでいけますから。

なるほどMTIncludeですね。ご回答ありがとうございます。

ところでこの外部化対象とするファイルを動的にしたいと考えているのですが、ご相談にのっていただけるでしょうか。

特定のカテゴリー(何個かあるので指定変更可だとありがたいのですが)のサブカテゴリーも含むエントリーの最新○件一覧を外部化して静的なトップページにMTIncludeで読み込ませたいと思ってます。できればこの一覧ファイルは動的な感じにして再構築しないでもすむようにと思ってますが、なにかよい方法はないでしょうか。

関係ないついでにもう1件すいません。
静的なHTMLをインデックス・テンプレートでいくつか作ってます。カテゴリーの中のいくつかをピックアップして、最新の20件とか表示されたり関連情報を載せたりしてるメインページのような構成をした静的HTMLです。
最近これをダイナミック化しようと思ってしてみると500エラーになり、動的に育成することができないようなのですが、自分で作ったHTMLを動的にする場合、何か気をつける点などありますでしょうか?そういえばメインページも500エラーでみれませんでした。アクセスがない時にも試しましたが、ファイル自体が育成されてないというかリンクが切れてるみたいな感じといいますか・・。

よろしくお願いします。

補足します。
メインページ(トップページ)や自分でインデックステンプレートで作ったファイルは静的なHTMLでhtaccessでSSIが動くようにしてます。
先日教えていただいた<MTInclude>は


<!--#include file="ファイル名.html" -->

のような感じで読み込んでます。これで再構築の時間がさらに少しでも短縮できればと考えているのですが、

メインページや自分で作ったHTMLもダイナミック化して動けばそれでよいのかもしれませんが、現状ではダイナミック化するとなぜかページが見れない、ダイナミック化して無事に稼動したとしても、現状ダイナミック化している個別ページではアクセスが多いのか、500エラーがでてしまうので、メインなどは静的のままできればhtmlでいければと考えてます。

ダイナミック化している個別ページでもかなりの確率で500エラーがでたり、表示までに時間がかなりかかってるのですが、ページを分解して外部ファイル化すればダイナミックページでもページ表示の高速化ができたりするのでしょうか?すいません、また質問になってしまいました。

よろしくお願いします。

スメルチさん、こんにちは。

>htaccessでSSIが動くようにしてます。
><MTInclude>は<!--#include file="ファイル名.html" -->のような感じで読み込んでます。

それで分かりました。ダイナミック・パブリッシングはphpですので、SSIは使えません。
SSI化した状態でダイナミックをオンにされたのならエラーして当たり前です。
ダイナミック・パブリッシングを使われるのなら、SSIの設定は削除して下さい。.htaccessも再構築オプションでダイナミックを選んだ時MTが自動生成するものに変えて下さい。
テンプレートからも<!--#include file="ファイル名.html" -->は全て削除して<MTInclude>に変えて下さい。
これでダイナミック・パブリッシングも正常に動作するようになると思います。

モジュール化するかどうか、外部ファイルが必要かどうかはダイナミックが正常に動くようになってから判断すべきことなので、まずはダイナミック・パブリッシングの動きを正常化することを目指して下さい。

>.htaccessも再構築オプションでダイナミックを選んだ時MTが自動生成するものに変えて下さい。

この辺設定を変更したつもりはないのですが、どこをみたらわかるでしょうか。

SSIを解除してみたのですが、やはりダイナミックをオンにすると500エラーになってしまいます。

<!--#include file="ファイル名.html" -->も全て削除されていますか?
500エラーはふつうCGI、SSI、.htaccessの記述間違い等で起こるものなので、SSIの設定が完全に削除されているなら、やっぱり.htaccessの記述のどこかが怪しいような気がします。

ブログディレクトリからいったん.htaccessを削除して下さい。それから再構築オプションでいったん静的生成を選んで設定を保存して下さい(再構築はしなくていいです)。その後でもう1回ダイナミックを選んで設定を保存し直して下さい。これで新たにダイナミック用の.htaccessが生成されますので、それで試してみて下さい。
それからサーバーはどこをお使いですか?

回答ありがとうございます。
サーバーはさくらです。

削除してみましたがやはりエラーに・・。
さくらなので
Options -Indexes +SymLinksIfOwnerMatch
はコメントアウトしてます。

トップをダイナミックでためしてみようと思って設定してみたのですがエラーになるのでとりあえず前の設定にもどしてみます。

ああ、さくらでしたか!
さくらはphpがcgiモードで動くので、phpファイルにもパーミッション755を与えなければいけないそうです。そうしないと500エラーになるとか…。とりあえずmtview.phpを755にしてみて下さい。

私はさくらは使ったことがないので、コメントやトラバをいただいた方からの聞きかじり情報ですけど、ヒントくらいになれれば嬉しいです。

ありがとうございます。

755にしてみると、一歩前進で500エラーはでず、HTMLを育成しようとした形跡がありました。
ただ中身がまったく表示されず真っ白な状態です。

メインをいじるとサイトに影響があるので、今回は自分でテンプレートから作ったHTMLで試してみてるのですが、もうちょっと調べてみます。

サイトの構成なのですが、現在

サイトURL ○○○.com
アーカイブURL ○○○.com/blog/

としているのですが、「blog」の中にも.htaccessやmtview.phpができているのですがこれらは関係ないでしょうか?(前にテストか何かしてゴミが残ってるのかもしれませんが・・)

今まで「アーカイブのみダイナミック」としてましたが、mtview.phpが755でなくても個別ページは動的に育成されてました。これも不思議ですが、今は「選択してダイナミック」にしてテストしてます。

自分で作ったHTMLはメインと同じ「○○○.com」直下に置いてるのですが、こちらの.htaccessやmtview.phpは更新されてるようですが「blog」下のこれらのファイルは更新されずそのままのようです。

.htaccessの設定でmtview.phpを指定してる箇所がありますが、そのまま「/mtview.php」のようにしています。この辺も関係あるでしょうか?

○○○.comと○○○.com/blog/は別のブログなのでしょうか。
それとも管理画面の公開の設定で「アーカイブを、サイト・パスとは別のパスで公開する場合は、チェックしてください」にチェックを入れてアーカイブURLをhttp://○○○.com/blog/とした、ということでしょうか。

>真っ白な状態
○○○.comが? それとも○○○.com/blog/の方が?
.htaccessのmtview.phpのパスが間違っている場合は真っ白ではなくて「404 Not Found」になると思うのですが…。

blog/以下にも.htaccessやmtview.phpがあるのなら、○○○.comと○○○.com/blog/は別のIDを持った別のブログかと思われるのですが、だとしたらスメルチさんの言われる「アーカイブのみダイナミックの設定」とは○○○.comと○○○.com/blog/どちらのアーカイブのことなのか、、、
すみません、ちょっとよく分からなくなってきましたので、よろしくお願い致します(^^;。

わかりにくくてスイマセン。
同じドメイン内で展開している同じブログです。

今またちょっとテストしてみたのですが、真っ白な状態でなくまた500エラーになりました。mtview.phpの属性みたら666に。そういえばさっき設定を一時的に「テンプレート別ダイナミック」から「アーカイブのみダイナミック」にして、さらに「テンプレート別ダイナミック」にもどしたのでした。これするだけで属性変更までされてしまうようですね。

blog/以下のファイルはどうやらテストで一時的に展開した別ブログのものが残ってたようです。手動で削除しました。

そこでもう一度試してみたのですが、ナント!うごきました。自分で作ったHTMLが動的に育成されてます!すいませんイロイロお手数かけました(^^ゞ他のページもこれから試してみます。

もう一つ相談があるのですが、よろしいでしょうか。なるべくサーバーに負荷をかけないようにできるだけ効率よいファイルの作り方というか構成をしたいと思っているのですが、現在16000強の記事数があり、php同時実行数のオーバーということで503エラーがでるような状況です。

mtview.phpの処理が多いというか遅いというかページの効率がよければ早く処理ができてエラーも減るかな、と考えてます。

今疑問に思っているのは「MTInclude module」と「MTInclude file」の違いです。

動的になった段階でアクセスと同時にページを育成する、ということですがどちらを使った方がサーバーによいでしょうか。「module」だとページ内にすべて含んだ状態まで、「file」だとその部分は外部ファイル化するわけですから、単純に読み込むだけですむのでその分phpの処理としては少ない、というようにイメージしているのですが、違うでしょうか?

よろしくお願いします。

あ~分かりました、同じブログだったんですね。
それならblog/以下の.htaccessやmtview.phpがよけいだったと思われるので、動くようになってよかったですね!

>「MTInclude module」と「MTInclude file」の違い
おおっ、やっとこの記事のテーマにたどりつくことが!
記事が16000もあるのなら、仰る通りに、「file」でモジュール化された方がいいです。「file」の場合、既に出来上がっているHTMLを読み込むだけの作業になるので(読み込み時にMTタグは動かない)ダイナミック時の動きも少なく抑えることが出来、サーバーの負担もその分減ります。「module」ですと読み込むたびにMTタグを動かして再構築することになるのでサーバーの負担は増えます。

サイドバーなど共通な部分は出来る限りインデックステンプレートで静的別パーツ化しておきます。それらのパーツは静的再構築しなければいけませんが、パーツ数枚程度なら十分いけると思います。トライしてみて下さい。なお、「file」で読み込めるのは静的ファイルだけです。動的ファイルは読み込めませんので、ダイナミック頁から静的パーツを読み込んで表示する形になります。

静的ファイルはパーツのみにすることで静的生成の数を減らし、動的ファイルに使われるMTタグの数も出来るだけ少なくなるようにするのがポイントになるかと思います。

なるほど静的化してないとダメなんですねー。できるだけfile化してみようと思います。

あといくつか質問したいことがありますが、こちらの内容とはなれるので別のページにコメントさせていただきます。

file化作戦、これで少しでもサーバー負担が減るようになるといいですね。
ダイナミックが上手くいくようになるとダイナミック用のカスタマイズも各種取り入れられるようになるので、またいろいろ試してみて下さいね。

トップページなのですがどうも変です。

昨日までダイナミック化が成功してたのですが、今日またうまくいってない。。

いつまでたってもページを表示しない、という感じです。なんだかわけがわからないのですが、さくらってトップページにindex.htmlがないと挙動が変になるのでしょうか。

昨日の時点でうまくいってたのに今日になって変というのはちょっとよくわかりません。

思い切って「cache」や「templates_c」の中身を削除してみましたが状況は変わらず。

一度トップページを静的化しようと試みましたが相変わらず再構築に時間がかかりすぎるので断念。

細分化した時にあるカテゴリーの5件分くらいの更新一覧を別ファイル化してたのですが、ここから直接個別エントリーにいくとダイナミック化はできてるようなのですが、そこからトップページに行こうとするとやはりダメで。

そういえば「.static」というファイルができてるのですが、これは何か関係あるファイルでしょうか。

すみません、こちらはXREAなので、さくら固有の問題については分からないのですが、いつまでたっても頁が表示されなかったりindex.html一枚に再構築の時間がかかりすぎるのも変ですね。ダイナミック以外のところに原因があるかもしれないので、新しくエントリーした「ダイナミック・パブリッシングを快適に使う10の方法」も見て下さい。

「.static」というファイルはダイナミック化した時にこれまでの静的頁が変更されたものですので、削除してかまいません。