TopMovable Typeカスタマイズ検索 > 2009年1月
2009年1月22日

タグ検索を絞り込む(その2:カスタマイズ)

January 22,2009 1:55 AM
Tag:[, , , ]
Permalink

タグ検索を絞り込む(その1)」の続きで、Movable Type 4 でのカスタマイズ方法です。

1.タグの絞り込み検索の仕組み

タグ検索は CGI(mt-search.cgi)を実行します。実行したURLのクエリー文字列の「tag=」の部分に、検索するタグ名を与えることでタグ検索が行なわれます。

例えば、タグ「Movable Type」による初回のタグ検索は次のようなURLを実行します。

http://user-domain/mt/mt-search.cgi?blog_id=1&tag=MovableType&limit=20&IncludeBlogs=1

このクエリー文字列「tag=」の右辺に、「 AND (ANDの前後に半角スペース)」を与えれば、複数のタグによる検索が可能になります。

例えば、タグ「Movable Type」と「Customize」で検索を行なうには、次のURLを実行します。

http://user-domain/mt/mt-search.cgi?blog_id=1&tag=MovableType%20AND%20Customize&limit=20&IncludeBlogs=1

「 AND 」はいくらでも連結できます。検索文字列と「AND」の間の「%20」は、半角スペースをURLエンコードしたものです。

つまり、前回のタグ検索文字列と今回のタグ検索文字列を「 AND 」で連結するサブテンプレートを作れば、この絞り込み検索の仕組みが実現できる訳です。

2.カスタマイズ

このカスタマイズでは Split プラグインを事前にインストールしてください。

その後、2.1~2.3に該当するいずれかの設定を行なってください。該当しない場合は、それらしき部分に追加してください。

なお、デザインはすべて確認できておりませんので、不具合がありましたらご連絡ください。

2.1 4.2 以降の「既定のブログ」の場合

次のサブテンプレート(青色)を、テンプレートモジュールの「ブログ記事の概要」に追加してください。

<mt:If name="entry_archive">
    <mt:EntryIfTagged>
        <div class="entry-tags">
            <h4>タグ<span class="delimiter">:</span></h4>
            <ul>
                <li><mt:EntryTags glue='<span class="delimiter">,</span></li> <li>'><a href="javascript:void(0)" onclick="location.href='<$mt:TagSearchLink encode_js="1"$>';return false;" rel="tag"><$mt:TagName$></a></mt:EntryTags></li>
            </ul>
<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>
 
<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
    <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
  </mt:unless>
</mt:entryTags>
 
<h4>絞り込みタグ<span class="delimiter">:</span></h4>
<ul>
  <li><mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" /></li>
</ul>
        </div>
    </mt:EntryIfTagged>
</mt:If>

2.2 4.0 ~ 4.1 の場合

次のサブテンプレート(青色)を、テンプレートモジュールの「タグ」に追加してください。

<MTEntryIfTagged>
<div class="entry-tags">
    <h4 class="entry-tags-header">タグ<span class="delimiter">:</span></h4>
    <ul class="entry-tags-list">
        <li class="entry-tag"><MTEntryTags glue='<span class="delimiter">,</span></li> <li class="entry-tag">'><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTBlogID$>" rel="tag"><$MTTagName$></a></MTEntryTags></li>
    </ul>
<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>
 
<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
    <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
  </mt:unless>
</mt:entryTags>
 
<h4 class="entry-tags-header">絞り込みタグ:<span class="delimiter">:</span></h4>
<ul class="entry-tags-list">
  <li class="entry-tag"><mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" /></li>
</ul>
</div>
</MTEntryIfTagged>

2.3 小粋空間テンプレートの場合

次のサブテンプレート(青色)を、テンプレートモジュールの「タグ」に追加してください。

<mt:entryIfTagged>
<div class="entry-tags">
   <h3 class="entry-tags-header">タグ:</h3>
   <ul class="entry-tags-list">
   <mt:entryTags>
      <li class="entry-tag"><a href="<mt:tagSearchLink />&amp;IncludeBlogs=<mt:blogID />" rel="tag"><mt:tagName /></a></li>
   </mt:entryTags>
   </ul>
<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>
 
<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
    <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
  </mt:unless>
</mt:entryTags>
 
<h3 class="entry-tags-header">絞り込みタグ:<span class="delimiter">:</span></h3>
<ul class="entry-tags-list">
  <li class="entry-tag"><mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" /></li>
</ul>
</div>
</mt:entryIfTagged>

3.サブテンプレート解説

2項のサブテンプレートの機能は、検索結果に表示されているブログ記事のタグから、現在の検索結果ページの検索タグを除外して表示します。そして、CGI(mt-search.cgi)のURLに、今回までの検索タグを「tag=」のクエリーに与えます。

このサブテンプレートを、いくつかのブロックに分けて解説します。

3.1 検索タグを分割して配列変数に設定

<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>

最初の MTSearchString タグで、今回表示されているタグ検索結果を変数 tag_name に保存します。変数 tag_name に「 AND 」が含まれていたら、split モディファイアを利用して、配列変数tag_listに、これまでのすべての検索タグを保存します。「 AND 」が含まれていない場合は、後続の処理で MTLoop タグを利用できるように、配列変数 tag_list の先頭に入れなおします。

3.2 ブログ記事に含まれるタグ一覧から、配列変数に設定されたタグを除外

<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
 ...中略...
  </mt:unless>
</mt:entryTags>

変数 tag_data を初期化し、MTEntryTag タグで、タグ検索でヒットしたブログ記事に含まれる、タグの一覧を処理します。変数 tag_flag は、これまでに使われた検索タグを出力から除外するためのフラグです。

フラグを設定する処理は、MTLoop タグを使って配列変数 tag_list をサーチすることで実現しており、これまでに使われた検索タグをみつけたら、変数 flag に 1 を設定します。

変数 tag_flag に 1 が設定されたら、次の MTUnless タグブロック内は実行せず、まだ検索タグとして登場していないタグだけを MTUnless タグブロック内で出力します。

3.3 ブログ記事に含まれるタグ一覧を変数に設定

<mt:unless name="tag_flag">
  <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
</mt:unless>

MTUnless タグ内部では、タグ検索用のリンクを出力します。href 属性の値に、前回までの検索タグを MTSearchString タグ、そして今回の検索タグを MTTagNameタグ で与え、その間を「%20AND%20」で区切ります。リンクは直接出力せず、MTSetVarBlock タグを使って、変数 tag_data に一旦保存します。理由はあとで説明します。

3.4 ブログ記事に含まれるタグ一覧を出力

絞り込みタグ:<mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" />

すべての処理が終わったら、変数 tag_data を出力します。

出力するタグの区切り文字をカンマ「,」にしているのですが、一番最後の「,」を、MTUnless タグブロック内の処理で出力しない制御がかなり面倒(=出力するタグが繰り返しの最後であることを判定するのが面倒)だったので、出力結果を一旦変数に保持し、変数を出力するときに regex_replace モディファイアで最後の1文字、つまりカンマを除去しています。

今回のタグ検索で使ったタグは、次のタグ検索結果ページの MTSearchString タグで取得できるので、再帰的な検索が行なえます。

Comments [8] | Trackbacks [1]
2009年1月21日

タグ検索を絞り込む(その1)

January 21,2009 1:55 AM
Tag:[, , , ]
Permalink

タグ検索を絞り込む方法を紹介します。

1.「タグの絞込み」という考えについて

「タグ」という新しい分類方法が登場して以来、

  「タグによる検索を絞り込むことができれば、ものすごく便利では?」

という考えをずっと持っていました。

主旨は大体お分かりと思いますが、タグを絞り込む例を図に示します。ブログに、「tag-A」「tag-B」「tag-C」という3つのタグをつけたエントリーが複数あると仮定します。

最初に「tag-A」というタグ名で検索すると、左上の円に属するエントリーが検索でヒットします。

tag-Aによる検索

「tag-A」をつけたエントリーの中には、「tag-B」がついているものもあります。両方のタグをつけたエントリーを検索できる方法があれば、下図のように検索範囲を絞り込むことができます。

tag-Aとtag-Bによる検索

同様に、「tag-A」「tag-B」をつけたエントリーの中に、「tag-C」をつけたものもあり、最終的に、3つのタグをつけたエントリーを検索できる方法があれば、さらに絞り込むことができます。

tag-Aとtag-Bとtag-Cによる検索

単に、「tag-A」「tag-B」「tag-C」という3つのタグを別々に検索を行なっても、3つの円が交わった部分を見つけるのは困難ですが、タグの絞込み検索を行なうことができれば、サイトを訪れたユーザーが目的のページに素早くアクセスできる可能性が高くなります。

もう少し具体例を挙げると、次のようなタグがついているエントリーがある、うちのようなサイトで、閲覧ユーザーが

  「Movable Type で、プラグインを使ったカスタマイズの記事を読みたい(緑色の部分)」

というケースの場合、大変有効である考えます。

タグ検索

2.実際のタグの絞込み検索

そういうわけで、当ブログでは、タグ検索の絞込みができるリンクを公開しています。エントリーのタグをクリックした次の検索結果のページに、絞込み候補のタグがあれば「Tagを絞り込む」という欄に表示します。

タグの絞り込み検索

試しに、エントリータイトルの右下にある任意のタグをクリックしてください。ここではリストをツリー表示するライブラリ「dTree」のタグをクリックしたと仮定します。

dTreeのタグをクリック

検索結果には「dTree」関連の記事が9件ヒットします。

dTreeタグが9件ヒット

この検索結果には、WordPress の記事と Movalbe TYpe の記事が混在しています。そこで、Movalbe TYpe の記事の「Tagを絞り込む」にある「Movable Type」をクリックします。

「Movable Type」でタグの絞り込み検索

検索結果に「「dTree AND MovableType」の検索結果」が表示され、絞り込み検索が行なわれたことが分かります。これで「dTree」かつ「Movable Type」の記事を4件に絞り込むことができました。

タグ検索

「エントリーに適切なタグをつけてください」というツッコミはなしで(笑)。

Movable Type 4 でのカスタマイズ方法については別途解説します。

Comments [2] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3