「WordPressで学ぶPHP(1)変数・制御構造編」が発売されました。
「WordPressで学ぶPHP」シリーズの第1巻で、WordPressを通してPHPを学んでいく本です。
この本では、PHPの基本となる変数と制御構造について解説します。
Kindle本で、定価500円です。
実行するテンプレートタグを変数で指定する
MTQに、「MTColor1/MTColor2/MTColor3の3つのカスタムフィールドを作ったときに、繰り返しを使って各カスタムフィールドの値を出力したい」といった内容の質問があがっていました。
すでにmtevalモディファイアで解決する方法が回答されていますが、プラグインを使う方法を紹介します。
1.mtevalモディファイアで処理する
ご質問のような事例の1つの解決方法は、mtevalモディファイアを使うことです。
1-1.mtevalモディファイアの動作
mtevalモディファイアは、テンプレートタグの値を出力する際に、その値をテンプレートとみなして、タグを再構築した結果を出力する働きをします。
たとえば、変数tmplの値が「<$mt:Color1$>」になっているとします。
この時に、「<$mt:GetVar name="tmpl" mteval="1"$>」のタグを実行するとします。
この場合、変数の値(<$mt:Color1$>)をテンプレートとみなして再構築し、結果としてMTColor1カスタムフィールドの値が出力されます。
1-2.変数にテンプレートタグを代入する
mtevalモディファイアを使う際には、変数にテンプレートタグを代入することがよくあります。
ただ、以下のようにして、変数にテンプレートタグそのものを直接に代入しようとしても、代入する前にそのテンプレートタグが再構築され、変数にはテンプレートタグの再構築結果が代入されてしまいます。
<mt:SetVarBlock name="tmpl"><$mt:Color1$></mt:SetVarBlock>
そこで、変数に代入する際に、「<」「>」をそれぞれ文字実体参照「<」「>」にしておきます。
そして、mtevalモディファイアを実行する前に、decode_htmlモディファイアで「<」「>」に戻すようにします。
<mt:SetVarBlock name="tmpl"><$mt:Color1$></mt:SetVarBlock> <$mt:GetVar name="tmpl" decode_html="1" mteval="1"$>
1-3.MTForタグと組み合わせる
あとは、MTForタグを使って、「mt:Color1」の最後の「1」を、「1」~「3」まで順に繰り返すようにします。
これで、MTColor1タグ~MTColor3タグを順に出力することができます。
<mt:For var="x" from="1" to="3"> <mt:SetVarBlock name="tmpl"><$mt:Color<$mt:GetVar name="x"$>$></mt:SetVarBlock> <$mt:GetVar name="tmpl" decode_html="1" mteval="1"$> </mt:For>
2.プラグインで処理する
mtevalモディファイアを使う方法は、プラグインが不要である点がメリットです。
ただ、テンプレートタグを文字実体参照に置き換えることが必要で、テンプレートの可読性がやや下がるデメリットがあります。
そこで、プラグインで処理する方法を紹介します。
2-1.TagExecプラグイン
実行するテンプレートタグを変数で指定するプラグインとして、「TagExec」というものを作りました。
以前に「TagInvoke」というプラグインがありましたが、それと似た動作をします。
TagExecプラグインは、以下からダウンロードします。
ダウンロードしたZipファイルを解凍すると、「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。
2-2.TagExecプラグインで追加されるテンプレートタグ
TagExecプラグインをインストールすると、「MTTagExecBlock」「MTTagExecFunction」というテンプレートタグが追加されます。
それぞれ、実行するブロックタグ/ファンクションタグの名前を、「tagname」というモディファイアで指定します。
その際、タグ名の先頭の「MT」は、省略することができます。
また、MTTagExecBlock/MTTagExecFunctionタグとも、tagname以外のモディファイアを指定すると、実行するテンプレートタグに、そのモディファイアを引き継ぐことができます。
たとえば、以下のようなテンプレートがあるとします。
<mt:Entries lastn="5"> <p><$mt:EntryTitle$>(<$mt:EntryDate format="%Y/%m/%d"$>)</p> </mt:Entries>
このテンプレートのすべてのタグをMTTagExecBlock/MTTagExecFunctionタグで書き換えると、以下のようになります。
<mt:TagExecBlock tagname="Entries" lastn="5"> <p><$mt:TagExecFunction tagname="EntryTitle"$>(<$mt:TagExecFunction tagname="EntryDate" format="%Y/%m/%d"$>)</p> </mt:TagExecBlock>
また、上記のテンプレートで、tagnameモディファイアを「tagname="MTEntries"」などにしても動作します。
2-3.MTForタグと組み合わせる
MTTagExecFunctionタグとMTForタグを組み合わせることで、MTColor1/MTColor2/MTColor3のように、先頭部分が同じで最後が連番になっているテンプレートタグを、繰り返し実行することができます。
実際にその処理を書くと、以下のようになります。
<mt:For var="x" from="1" to="3"> <mt:SetVarBlock name="tagname">Color<$mt:GetVar name="x"$></mt:SetVarBlock> <$mt:TagExecFunction tagname="$tagname"$> </mt:For>
1行目のMTForタグで、変数xの値を1から3まで順に変化させながら繰り返します。
2行目のMTSetVarBlockタグで、変数tagnameに、「Color」の文字列と、変数xの値を連結した値(=「Color1」など)を代入します。
そして、3行目のMTTagExecFunctionタグで、変数tagnameの値(=「Color1」など)のテンプレートタグを実行します。
4.TagExecプラグインの制限事項
TagExecプラグインでは、tagnameモディファイアに条件判断系のタグを指定すると、正しく動作しない場合があります。