flexibleSearch.js で読み込む JSON を Movable Type で出力する

flexibleSearch.js - ページ送りに対応した高速 Ajax 検索が可能な jQuery プラグイン」の検索対象となる JSON を、Movable Type で出力する方法を紹介します。

インデックステンプレートの作成

MT でインデックステンプレートを作成します。作成するテンプレートの情報は次のようにします。

テンプレート名
検索用JSON(自由に設定してください)
出力ファイル名
search_data.js(変更しても構いません)
テンプレートの種類
カスタムインデックステンプレート
公開
スタティック(既定)

テンプレートの内容は、いくつかパターンを用意しました。

その前に少し解説

remove_html="1"

HTMLタグは検索には不要なので削除しておきます。

regex_replace="/\n|\t/g",""

これは、改行やタブを残しておくと、出力するときに \n や \t に変換されてしまい、無駄にファイルサイズが大きくなってしまうので、あらかじめ削除しておくためです。

to_json="1"

これを指定すると、ハッシュ(連想配列)をきれいに JSON の形で出力してくれます。encode_js="1"だとうまくいきませんでしたので、この方法がオススメです。

なお、実際のテンプレートは、ファイルサイズを少しでも小さくするために改行を入れない方が良いと思います。

ブログ記事のみの場合

{"item":[
<mt:entries lastn="0">
<mt:setvarBlock name="item{title}"><mt:entryTitle></mt:setvarBlock>
<mt:setvarBlock name="item{url}"><mt:entryPermalink></mt:setvarBlock>
<mt:setvarBlock name="item{tag}">,<mt:entryTags glue=","><mt:tagName></mt:entryTags>,</mt:setvarBlock>
<mt:setvarBlock name="item{body}"><mt:entryBody remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:setvarBlock name="item{more}"><mt:entryMore remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:var name="item" to_json="1"><mt:unless __last__>,</mt:unless __last__>
</mt:entries>
]}

ブログ記事+ウェブページの場合

{"item":[
<mt:entries lastn="0">
<mt:setvarBlock name="item{title}"><mt:entryTitle></mt:setvarBlock>
<mt:setvarBlock name="item{url}"><mt:entryPermalink></mt:setvarBlock>
<mt:setvarBlock name="item{tag}">,<mt:entryTags glue=","><mt:tagName></mt:entryTags>,</mt:setvarBlock>
<mt:setvarBlock name="item{body}"><mt:entryBody remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:setvarBlock name="item{more}"><mt:entryMore remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:var name="item" to_json="1"><mt:if tag="blogPageCount">,</mt:if>
</mt:entries>
<mt:pages lastn="0">
<mt:setvarBlock name="item{title}"><mt:pageTitle></mt:setvarBlock>
<mt:setvarBlock name="item{url}"><mt:pagePermalink></mt:setvarBlock>
<mt:setvarBlock name="item{tag}">,<mt:pageTags glue=","><mt:tagName></mt:pageTags>,</mt:setvarBlock>
<mt:setvarBlock name="item{body}"><mt:pageBody remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:setvarBlock name="item{more}"><mt:pageMore remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:var name="item" to_json="1"><mt:unless __last__>,</mt:unless __last__>
</mt:pages>
]}

ブログ記事+ウェブページで並び順を公開日時順にする場合

<mt:entries lastn="0">
<mt:entrydate format="%Y%m%d%H%M%S" setvar="date">
<mt:setvarBlock name="item{title}"><mt:entryTitle></mt:setvarBlock>
<mt:setvarBlock name="item{url}"><mt:entryPermalink></mt:setvarBlock>
<mt:setvarBlock name="item{tag}">,<mt:entryTags glue=","><mt:tagName></mt:entryTags>,</mt:setvarBlock>
<mt:setvarBlock name="item{body}"><mt:entryBody remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:setvarBlock name="item{more}"><mt:entryMore remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:setvarBlock name="items" key="$date"><mt:var name="item" to_json="1"></mt:setvarBlock>
</mt:entries>
<mt:pages lastn="0">
<mt:pagedate format="%Y%m%d%H%M%S" setvar="date">
<mt:setvarBlock name="item{title}"><mt:pageTitle></mt:setvarBlock>
<mt:setvarBlock name="item{url}"><mt:pagePermalink></mt:setvarBlock>
<mt:setvarBlock name="item{tag}">,<mt:pageTags glue=","><mt:tagName></mt:pageTags>,</mt:setvarBlock>
<mt:setvarBlock name="item{body}"><mt:pageBody remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:setvarBlock name="item{more}"><mt:pageMore remove_html="1" regex_replace="/\n|\t/g",""></mt:setvarBlock>
<mt:setvarBlock name="items" key="$date"><mt:var name="item" to_json="1"></mt:setvarBlock>
</mt:pages>
{"item":[
<mt:loop name="items" glue="," sort_by="key numeric reverse"><mt:var __value__></mt:loop>
]}

カスタムフィールドも入れたい場合

カスタムフィールドを入れたい場合も、普通のフィールドと同様にして追加してください。item{キー}のキー部分は、カスタムフィールドの basename にしておくと良いでしょう。

以上です。

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