はじめての DynamicMTML #09 - MTSearchEntries (5) MTReferralKeywords で検索サイトからの流入に対する関連記事を表示する

今回は、MTReferralKeywords というブロックタグを使い、Google、Yahoo!、bing、MSN、goo で検索してサイトに訪れたユーザーに対して、そのキーワードに関連する記事をリストアップする方法を紹介します。

今回のテンプレートの仕様

  • 検索サイトで検索されたキーワードを含むブログ記事一覧を表示する
  • 検索サイトからの流入のときだけ表示する
  • 現在のブログ内のブログ記事から検索する
  • 最新5件を表示する
  • 現在のブログ記事を除く

MTReferralKeywords の使い方

MTReferralKeywords タグは、Google、Yahoo!、bing、MSN、goo からの流入の際に、検索されたキーワードをループで出力するブロックタグです。

また、検索サイトからの流入だけでなく、サイト内検索の際のパラメータ(query または search)にセットされたキーワードも同様にループで出力します。

キーワードは、変数 keyword にセットされます。

MTReferralKeywords のモディファイアなど

glue

1回のループを繋ぎ合わせる文字列を指定します。

MTVar にセットされる値

MTReferralKeywords タグ内では、以下の値が MTVar にセットされます。

  • keyword: 検索されたキーワード
  • __first__: ループの最初
  • __counter__: ループの何回目か
  • __odd__: 奇数回目の出力
  • __even__: 偶数回目の出力
  • __last__: ループの最後

MTReferralKeywords と関連するファンクションタグ

MTReferralKeyword

MTReferralKeyword は、Google、Yahoo!、bing、MSN、goo からの流入や、サイト内検索(パラメータが query または search)の際に、検索されたキーワードをそのまま出力します。

モディファイアは特にありません。

サンプル

さっそく MTReferralKeywords をシンプルな例で試してみましょう。

インデックステンプレートに次のテンプレートを書きます。

<mt:DynamicMTML>
<$mt:ReferralKeyword$>」で検索
<mt:ReferralKeywords>
<mt:If name="__first__"><ul></mt:If>
  <li><mt:Var name="keyword"></li>
<mt:If name="__last__"></ul></mt:If>
</mt:ReferralKeywords>
</mt:DynamicMTML>

Google で「はじめて dynamicmtml」と検索すると運良くこのインデックステンプレートのページが表示されました。

startup-dymtml-27

ここからアクセスすると次のように表示され、ちゃんとキーワードが出力されていることが分かります。

startup-dymtml-28

MTReferralKeywords タグについて分かったところで、今回の記事のコードを見ていきましょう。

完成したコード

今回の記事の完成版のコードは次のようになります。

<$mtml tag='mt:SetVars'$>
blog_id=<$mt:BlogID$>
entry_id=<$mt:EntryID$>
limit=5
<$mtml tag='/mt:SetVars'$>

<mt:DynamicMTML>
<$mt:SetVar name="keywords_length" value="0"$>
<mt:ReferralKeywords>
<$mt:SetVar name="keywords_length" op="++"$>
</mt:ReferralKeywords>

<mt:ReferralKeywords>
<$mt:Var name="__counter__" setvar="ref_counter"$>
<mt:SearchEntries query="$keyword" blog_id="$blog_id" not_entry_id="$entry_id">
<$mt:EntryDate format="%Y%m%d%H%M%S" setvar="date"$>
<mt:SetVarBlock name="entries" key="$date">
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a><br /><$mt:EntryBody$></li>
</mt:SetVarBlock>
</mt:SearchEntries>
<mt:If name="ref_counter" eq="$keywords_length">
<mt:Loop name="entries" sort_by="key reverse">
<mt:If name="__counter__" eq="1">
<h3>「<$mt:ReferralKeyword$>」に関連するブログ記事</h3>
<ul>
</mt:If>
<mt:If name="__counter__" le="$limit">
<mt:Var name="__value__" highlightingsearchword="match-words">
</mt:If>
<mt:If name="__counter__" eq="$limit">
</ul>
</mt:If>
</mt:Loop>
</mt:If>
</mt:ReferralKeywords>
</mt:DynamicMTML>

以下、コードを分解して解説していきますが、このコードは、「はじめての DynamicMTML #07 - MTSearchEntries (3) MTSplitVars を組み合わせて複数ワードのOR検索」のコードがベースになっていますので、詳細は、そちらの記事もご確認ください。

このテンプレートで出力したブログ記事に、Google で「はじめて dynamicmtml」というキーワードで検索して訪れると次のようになります。

startup-dymtml-30

普通にアクセスすると次のようになにも表示されません。

startup-dymtml-31

ではテンプレートを解説していきます。

MTSearchEntries に渡す変数をセットする

<$mtml tag='mt:SetVars'$>
blog_id=<$mt:BlogID$>
entry_id=<$mt:EntryID$>
limit=5
<$mtml tag='/mt:SetVars'$>

最初に MTSearchEntries に渡すための変数をセットしています。スタティックパブリッシングで出せるものはスタティックで処理します。

検索ワードの数を取得する

以下、MTDynamicMTML タグの中身になります。

<$mt:SetVar name="keywords_length" value="0"$>
<mt:ReferralKeywords>
<$mt:SetVar name="keywords_length" op="++"$>
</mt:ReferralKeywords>

その最初で、一度 MTReferralKeywords を回して検索ワードの数を取得しています。

MTReferralKeywords の手前で変数 keywords_length を初期化(=0)し、MTReferralKeywords の中でインクリメント(+1)しています。

MTSearchEntries で検索ワードに関連するブログ記事を検索する

以下、MTReferralKeywords タグの中身になります。まずは上段を解説します。

MTSearchEntries でブログ記事を検

<mt:ReferralKeywords>
<$mt:Var name="__counter__" setvar="ref_counter"$>
<mt:SearchEntries query="$keyword" blog_id="$blog_id" not_entry_id="$entry_id">
<$mt:EntryDate format="%Y%m%d%H%M%S" setvar="date"$>
<mt:SetVarBlock name="entries" key="$date">
<li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a><br /><$mt:EntryBody$></li>
</mt:SetVarBlock>
</mt:SearchEntries>

(下段は後述)

</mt:ReferralKeywords>

最初に変数 ref_counter に MTReferralKeywords の特別な変数を代入しています。この理由は「特別な変数の初期化」をご覧ください。

※実はこの MTReferralKeywords では、__counter__ がちゃんと局所化されているので、この変数の初期化不要なのですが、この方が見やすいと思うので入れることにしました。

次に、MTSearchEntries で検索ワードを含むブログ記事を検索し、公開日時をキーとしたハッシュ変数 entries にセットしていきます。

MTReferralKeywords では、変数 keyword に検索ワードがセットされているので、それをそのまま MTSearchEntries に渡しています(query="$keyword")。

MTSearchEntries タグの詳細はこちらをご覧ください。

ちなみに、ここの中で「<br /><$mt:EntryBody$>」と言う部分がありますが、これはサンプルサイトでキーワードが含まれるのが本文だったので便宜上入れてあるだけで特に意味はありません。

MTLoop で値の取り出し

続いて下段の説明です。実際に HTML を出力するのはこの部分です。

<mt:ReferralKeywords>

(上段は前述)

<mt:If name="ref_counter" eq="$keywords_length">
<mt:Loop name="entries" sort_by="key reverse">
<mt:If name="__counter__" eq="1">
<h3>「<$mt:ReferralKeyword$>」に関連するブログ記事</h3>
<ul>
</mt:If>
<mt:If name="__counter__" le="$limit">
<mt:Var name="__value__" highlightingsearchword="match-words">
</mt:If>
<mt:If name="__counter__" eq="$limit">
</ul>
</mt:If>
</mt:Loop>
</mt:If>
</mt:ReferralKeywords>

下段は、MTIf タグによって、MTReferralKeywords のループの回数(変数 ref_counter)がキーワードの数(変数 keywords_length)と一致するとき、つまり、MTReferralKeywords の最後のループのときだけ実行されるようにしています。

そして、MTLoop タグで、変数 entries から key(ここでは公開日)を基準に降順(reverse)で値(__value__)を取り出しています。

MTLoopの中では、__counter__ の値と上段の初めの方でセットした変数 limit の値を比較して個数を制御しています。

これで完成です。

highlightingsearchword で検索ワードをハイライト

MTLoop の中で変数の値を取り出すところで highlightingsearchword というモディファイア付けています。

<mt:Var name="__value__" highlightingsearchword="match-words">

highlightingsearchword は、Google、Yahoo!、bing、MSN、goo からの流入や、サイト内検索(パラメータが query または search)の際に、検索されたキーワードを、モディファイアで指定した値の class を付けた strong タグでマークアップするモディファイアです。

この highlightingsearchword モディファイアは、ファンクションタグ・ブロックタグの両方に付けることができます。

仮に「はじめて dynamicmtml」という検索ワードからの流入だとして、以下のコードはいずれも同じように出力されます。なお、ブログ記事本文には「はじめての DynamicMTML」とだけ書いてあるとします。もちろん、どれも DynamicMTML でダイナミックに出力するという前提です。

<mt:DynamicMTML>
==== ここから ====<br />
<$mt:SetVar name="sample1" value="はじめての DynamicMTML"$>
(1) <$mt:Var name="sample1" highlightingsearchword="1"$><br />

(2) <$mt:EntryBody highlightingsearchword="1"$><br />

(3) <mt:Unless highlightingsearchword="1"><$mt:EntryBody$></mt:Unless>
==== ここまで ====
</mt:DynamicMTML> 

これをブログ記事アーカイブテンプレートに貼り付けると、以下のように出力されます。

startup-dymtml-29

ちなみに、このサンプルで見ても分かるように、highlightingsearchword に 1 を設定すれば、デフォルトの「search-word」という class が付きます。

AND検索の場合

今回の記事は OR 検索の例でしたが、AND 検索にしたい場合は、「はじめての DynamicMTML #08 - MTSearchEntries (4) MTSplitVars を組み合わせて複数ワードのAND検索」のコードを今回の記事を参考に書き換えればOKです。

最後に、AND 検索にした場合のコードも掲載しておきます。

<$mtml tag='mt:SetVars'$>
blog_id=<$mt:BlogID$>
entry_id=<$mt:EntryID$>
limit=5
<$mtml tag='/mt:SetVars'$>

<mt:DynamicMTML>
<$mt:SetVar name="keywords_length" value="0"$>
<mt:ReferralKeywords>
<$mt:SetVar name="keywords_length" op="++"$>
</mt:ReferralKeywords>
<mt:ReferralKeywords>
  <$mt:Var name="__counter__" setvar="ref_counter"$>
  <mt:SearchEntries query="$keyword" blog_id="$blog_id" not_entry_id="$entry_id">
    <$mt:EntryDate format="%Y%m%d%H%M%S" setvar="date"$>
    <mt:If name="ref_counter" eq="1">
      <mt:SetVarBlock name="entries" key="$date">
        <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a><br /><$mt:EntryBody$></li>
      </mt:SetVarBlock>
      <$mt:SetVar name="match_count" key="$date" value="1"$>
    <mt:Else>
      <mt:If name="entries" key="$date">
        <$mt:SetVar name="match_count" key="$date" op="++"$>
      </mt:If>
    </mt:If>
  </mt:SearchEntries>
  <mt:If name="ref_counter" eq="$keywords_length">
<mt:Loop name="entries">
<mt:If name="match_count" key="$__key__" eq="$keywords_length">
<$mt:SetVar name="result" key="$__key__" value="$__value__"$>
</mt:If>
</mt:Loop>
    <mt:Loop name="result" sort_by="key reverse">
      <mt:If name="__counter__" eq="1">
<h3>「<$mt:ReferralKeyword$>」に関連するブログ記事</h3>
        <ul>
      </mt:If>
      <mt:If name="__counter__" le="$limit">
          <mt:Var name="__value__" highlightingsearchword="match-words">
      </mt:If>
      <mt:If name="__counter__" eq="$limit">
        </ul>
      </mt:If>
    </mt:Loop>
  </mt:If>
</mt:ReferralKeywords>
</mt:DynamicMTML>

以上です。

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