はじめての DynamicMTML #06 - MTSearchEntries (2) 基本的な使い方

前回は、ブログ記事を動的に検索する MTSearchEntries タグの説明をしました。

今回は、MTSearchEntries の基本的な使い方を紹介します。なお、以下の記事のテンプレートは「ブログ記事アーカイブ」テンプレートでの利用を想定しています。

検索ワードをキーワード欄等を使って指定したい

前回の説明の中では、query モディファイアに検索ワードを直接設定していましたが、ここでは、検索ワードをキーワード欄やカスタムフィールド等を利用して設定し、ブログ記事ごとに表示結果を変えられるようにします。

サンプルのテンプレートの仕様と注目するコード

  • 検索ワードは「キーワード」欄を利用して指定する
    → <$mt:EntryKeywords setvar="key"$>, query="$key"
  • 現在のブログ内のブログ記事から検索する
    → <$mt:BlogID setvar="blog_id"$>, blog_id="$blog_id"
  • 最新5件を表示する
    → lastn="5"

テンプレート

<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>

startup-dymtml-17

検索結果から現在のブログ記事を除きたい

サンプルのテンプレートの仕様

上記の仕様に「現在のブログ記事を除く」を追加

  • 検索ワードは「キーワード」欄を利用して指定する
  • 現在のブログ内のブログ記事から検索する
  • 最新5件を表示する
  • 現在のブログ記事を除く

テンプレート

<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>

startup-dymtml-18

解説

現在表示されているブログ記事を除くには、MTSearchEntries タグに「unique="1"」のモディファイアを付ければ簡単にできそうですが、これではダメです。unique は、同じテンプレート内で、別の「MTSearchEntries タグ」で出力されたものは除く、ということになります。

したがって、ここでは MTSearchEntries タグは1つしかないので、not_entry_id に現在のブログ記事IDを渡してあげるようにします。

ブログ記事もウェブページもまとめて検索したい

サンプルのテンプレートの仕様

上記の仕様に「ブログ記事もウェブページもまとめて検索する」を追加
→ class="*"

  • 検索ワードは「キーワード」欄を利用して指定する
  • 現在のブログ内のブログ記事から検索する
  • 最新5件を表示する
  • 現在のブログ記事を除く
  • ブログ記事もウェブページもまとめて検索する

テンプレート

<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 モディファイアに「*」を指定すれば、ブログ記事とウェブページの両方を対象に検索できます。

startup-dymtml-20

検索結果に含まれる検索ワードをハイライトしたい

サンプルのテンプレートの仕様

これまでの仕様に「検索結果に含まれる検索ワードをハイライトする」を追加

  • 検索ワードは「キーワード」欄を利用して指定する
  • 現在のブログ内のブログ記事から検索する
  • 最新5件を表示する
  • 現在のブログ記事を除く
  • ブログ記事もウェブページもまとめて検索する
  • 検索結果に含まれる検索ワードをハイライトする

テンプレート

※ここでは検索ワードが「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>

startup-dymtml-19

解説

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 で提供されているタグを組み合わせた使い方を紹介しようと思います。

  • このエントリーをはてなブックマークに追加
Just a second...