前回は、ブログ記事を動的に検索する MTSearchEntries タグの説明をしました。 今回は、MTSearchEntries の基本的な使い方を紹介します。なお、以下の記事のテンプレートは「ブログ記事アーカイブ」テンプレートでの利用を想定しています。...
前回は、ブログ記事を動的に検索する MTSearchEntries タグの説明をしました。
今回は、MTSearchEntries の基本的な使い方を紹介します。なお、以下の記事のテンプレートは「ブログ記事アーカイブ」テンプレートでの利用を想定しています。
前回の説明の中では、query モディファイアに検索ワードを直接設定していましたが、ここでは、検索ワードをキーワード欄やカスタムフィールド等を利用して設定し、ブログ記事ごとに表示結果を変えられるようにします。
<mt:DynamicMTML>
<$mt:BlogID setvar="blog_id"$>
<$mt:EntryKeywords setvar="key"$>
<mt:SearchEntries query="$key" blog_id="$blog_id" lastn="5">
<mt:If name="__first__"> <h2>「<$mt:Var name="key"$>」に関連するブログ記事</h2>
<ul>
</mt:If>
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
<mt:If name="__last__">
</ul>
</mt:If>
</mt:SearchEntries>
</mt:DynamicMTML>
上記の仕様に「現在のブログ記事を除く」を追加
<mt:DynamicMTML>
<$mt:BlogID setvar="blog_id"$>
<$mt:EntryID setvar="entry_id"$>
<$mt:EntryKeywords setvar="key"$>
<mt:SearchEntries query="$key" blog_id="$blog_id" lastn="5" not_entry_id="$entry_id">
<mt:If name="__first__">
<h2>「<$mt:Var name="key"$>」に関連するブログ記事</h2>
<ul>
</mt:If>
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
<mt:If name="__last__">
</ul>
</mt:If>
</mt:SearchEntries>
</mt:DynamicMTML>
現在表示されているブログ記事を除くには、MTSearchEntries タグに「unique="1"」のモディファイアを付ければ簡単にできそうですが、これではダメです。unique は、同じテンプレート内で、別の「MTSearchEntries タグ」で出力されたものは除く、ということになります。
したがって、ここでは MTSearchEntries タグは1つしかないので、not_entry_id に現在のブログ記事IDを渡してあげるようにします。
上記の仕様に「ブログ記事もウェブページもまとめて検索する」を追加
→ class="*"
<mt:DynamicMTML>
<$mt:BlogID setvar="blog_id"$>
<$mt:EntryID setvar="entry_id"$>
<$mt:EntryKeywords setvar="key"$>
<mt:SearchEntries query="$key" blog_id="$blog_id" lastn="5" not_entry_id="$entry_id" class="*">
<mt:If name="__first__">
<h2>「<$mt:Var name="key"$>」に関連するブログ記事</h2>
<ul>
</mt:If>
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
<mt:If name="__last__">
</ul>
</mt:If>
</mt:SearchEntries>
</mt:DynamicMTML>
class モディファイアに「*」を指定すれば、ブログ記事とウェブページの両方を対象に検索できます。
これまでの仕様に「検索結果に含まれる検索ワードをハイライトする」を追加
※ここでは検索ワードが「dynamicmtml」で、これはサンプルサイトでは本文にしか含まれていないので、説明上、MTEntryBody も表示させます。
<mt:Unless name="dynamic" replace="_mt:","mt:">
<_mt:SearchEntries query="<$mt:EntryKeywords$>" blog_id="<$mt:BlogID$>" lastn="5" not_entry_id="<$mt:EntryID$>" regex_replace="/(<$mt:EntryKeywords$>)/gi","<strong class='search-word'>\$1</strong>">
<mt:DynamicMTML>
<mt:If name="__first__">
<h2>「<$mt:EntryKeywords$>」に関連するブログ記事</h2>
<ul>
</mt:If>
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a><br /><$mt:EntryBody$></li>
<mt:If name="__last__">
</ul>
</mt:If>
</mt:DynamicMTML>
</_mt:SearchEntries>
</mt:Unless>
DynamicMTML には「highlightingsearchword」といって検索ワードを自動的にハイライト(正確には任意のクラス名を持った strong タグの付与)するモディファイアが提供されているのですが、残念ながらこのモディファイアは、今回のサンプルのような検索には使えません(使い方は後日書きます)。
そこで、MT のグローバル・モディファイアの regex_replace を利用して検索ワードをハイライトします。
上記テンプレートでは、MTSearchEntries の開始タグを「_mt:SearchEntries」とし、全体を MTUnless タグで囲っています。これは、「はじめての DynamicMTML #03 - スタティックパブリッシングで DynamicMTML を使う書き方」の『replace する裏技的な方法』で書いた、少しトリッキーな方法です。
この書き方をすることで、regex_replace モディファイアの1つ目の値に、検索ワードに MT タグの値を設定できます。regex_replace モディファイアの1つ目の値に変数($hogeなど)を渡すことができないための対策です。
また、regex_replace モディファイアの2つ目の値には、1つ目の値でマッチした用語を利用するために「\$1」と書いています。スタティック・パブリッシングで処理される regex_replace モディファイアであれば「$1」と書けばいいのですが、今回のモディファイアはダイナミックに処理されるので、「$」をエスケープする必要があるのです(こちらも参照ください。小粋空間: regex_replace モディファイアをダイナミックパブリッシングで利用する場合の注意)。
今回は以上です。
他にもカテゴリやタグを指定したりすることもできます。MTSearchEntries の基本的な使い方は「はじめての DynamicMTML #05 - MTSearchEntries (1) 動的にブログ記事を検索する」を参考にお試しください。
次回以降では、MTSearchEntries タグと、その他 DynamicMTML で提供されているタグを組み合わせた使い方を紹介しようと思います。