Header Menu

MT 向け Ajax サイト内検索

以前から暴想さんで公開されている Ajax を使用した Blog 向けサイト内検索を社内的なサイトで使わせて頂いたのでお礼を兼ねて紹介。実際にベースにしたのは暴想さんのスクリプトを元に Movable Type 向けにカスタマイズされた Dakiny さんバージョン

そいつをさらにカスタマイズさせてもらって使用しましたが、そのバージョンを折角ですので公開してみようと思います。

今回使わせていただいた blog_ajax_json_search.js は、エントリーのタイトルや本文、コメント (コメントも検索対象にしたは風柳亭さんによるカスタマイズ) を全部 JSON で書き出しておいて、そいつを JavaScript で検索する仕組みなので、とにかく検索が早い。かなり便利なスクリプトです。もちろんそのままでも十分使えるのですが、個人的に気になった点とかをカスタマイズしています。

とりあえず、必要なファイル一式は下記においてあります。

blog_ajax_json_search.zip

当サイトのエントリーデータを使用したサンプルが下記で試せます。

Ajax サイト内検索サンプル

それでは解説を。

ダウンロードしたファイルを解凍すると、下記のようなファイルが含まれています。

  • Ajax_search_form.txt
  • head_js.txt
  • search_data.txt
  • index.html
  • js/
    • blog_ajax_json_search.js
    • prototype.js
  • css/
    • sample.css
  • img/
    • icon_arrow.gif
    • loader.gif

まずはフォルダからですが、js、img の両フォルダは、そのままアップロードしてください。ドメイン直下に置かれることを想定していますので、パスが変わる場合は、何ヶ所か変更しなければならない場所が出てきますのでご注意を。

ちなみに、blog_ajax_json_search.js の文字コードが 「utf-8」 なので、Blog の文字コードがそれ以外の場合は、一度文字コードを変更して保存しなおしてください。

それから、css フォルダ内のスタイルシートは、今回のサンプルで使用しているスタイルなので、参考までに。動作に関係はありません。

次にファイルです。index.html はサンプルの XHTML ソースなので、これも参考まで。重要なのは下記です。

  • Ajax_search_form.txt
  • head_js.txt
  • search_data.txt

Ajax_search_form.txt は検索フォーム周りのソース。MT テンプレートタグが仕込んでありますので、そのままお使いのテンプレートに入れ込んで再構築してもらえれば大丈夫かと。

head_js.txt は JavaScript ファイルをヘッダで読み込むための記述。これも MT エントリータグが入っていますので、お使いのテンプレートの <head> ~ </head> 内にコピペしてもらえれば OK。

search_data.txt は検索用のデータを書き出すテンプレートのソースです。これで書き出されたデータが検索の具ってことになります。

MT 上で新規インデックステンプレートの作成に進み、このソースをコピペ。出力ファイル名に 「search_data.txt」 を指定して保存、再構築してください。それから再構築の設定は、インデックス・テンプレートの再構築時に、このテンプレートも自動的に再構築されるようにしておいてください。

今回は Blog の URI 直下にこのファイルが書き出されていることを想定しています。ちなみにテンプレート内の <MTEntries lastn="0"> って記述は間違いじゃなく、lastn="0" にしておくと全エントリーが書き出されるからです。

最後に、お使いのテンプレート内で、検索結果を表示したい部分に

<div class="result"></div>

という記述を追加してください。div 要素内は空でも、既存のソースを囲む形でも大丈夫。検索結果表示の際にはこれで囲まれた部分が結果表示と置き換わります。

これで、動作すると思います。うまく動かない場合はファイルのパスとか調べてみてください。

最後に私が変更した点を下記にまとめておきます。

blog_ajax_json_search.js 内の変更点

  1. 検索中の表示をちょこっと改良して、ロード中画像が出るようにした。
  2. 検索キーワードが未入力の場合はエラーを返すように変更。 (オリジナルは全エントリーを返しますが、エントリー数が多い場合にかなり重たいので)
  3. 検索キーワード、ハイライト部分のマークアップを <span class="keywords"> ~ </span> に変更。(オリジナルはstyle 属性による直指定)
  4. 検索結果の出力ソースをごっそり変更。(出力されるソースは後述)
  5. 検索フォームの小細工 (初期テキストがフォーカスで消えるやつ) 用のソースをお尻に追加。

合わせてフォーム部分のソースもかなりいじってますので、ベースにさせていただいたソースとは違っています。

で、検索結果で出力されているソースが下記。スタイル当てる際の参考にどうぞ。

<div class="section">
 <h2>「検索キーワード」の検索結果(○ 件)</h2>
 <dl>
  <dt>
   <a href="エントリーURI" title="エントリータイトル">エントリータイトル</a>
  </dt>
  <dd>本文、追記、コメントから検索キーワードに該当した部分</dd>
 </dl>
</div>
<p class="search_back">
 <a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a>
</p>

検索結果が 0件だったときは下記のソース。

<div class="section">
 <h2>「検索キーワード」の検索結果(0 件)</h2>
 <p>該当するエントリーはありませんでした。</p>
</div>
<p class="search_back">
 <a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a>
</p>

キーワードが入力されていない場合は下記。

<div class="section">
 <h2>検索キーワード未入力</h2>
 <p>検索キーワードが入力されていません。キーワードを指定してください。</p>
</div>
<p class="search_back">
 <a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a>
</p>

ちなみに、スクリプトのライセンスがスクリプトファイル内の頭に記述されていますので、再配布やらする方は必ず確認してください。

Add to Bookmarks
  • Hatenaブックマークに追加
  • del.icio.usに追加
  • POOKMARK Airlinesへ追加
  • livedoorクリップへ追加
  • ニフティクリップへ追加
  • Buzzurlにブックマーク
  • newsingへ投稿
  • Choixへ追加
  • Furlへ追加
  • Blinklistへ追加
  • Redditへ追加
Advertisement

comment & trackback

TRACKBACK URL : http://hyper-text.org/cms/mt-tb.cgi/405

trackback to this entry

MTのテンプレート化と検索機能

MTのデフォルトのテンプレートを参考にしながら、作成したhtmlをテンプレート化...

from おでのMemo, December 17, 2007 - 12:35.

MovableType用Ajax検索 その1

タグ検索と、全文検索をAjax対応にしました。すごく大変でした。。。 とはいってもゼロから作ったわけではなく、すばらしい元ネタがあったため、...

from GaS:Grumbling about Something, July 20, 2008 - 02:31.

MovableType用Ajax検索(タグ検索) その2

前回に引き続きMovableType用のAjax検索の使い方を掲載。 今回はタグの検索機能の使い方です。こっちの方が使い方は多分簡単? あ、...

from GaS:Grumbling about Something, July 20, 2008 - 14:26.

comments

羊, December 2, 2007 - 15:37.

はじめまして。このページを参考にしてブログ内検索ができました。
ごっそり変えられた、というあたりが素晴らしくて感服しています。
おたずねしてみるのですが、
複数ブログでサイトを構成している場合に、各ブログをまたいで検索させることもできないでしょうか?

検索用ページをトップのみに置くなりして、
その下の階層に置いているA、B、C・・・それぞれのブログ全てを対象に検索させるというかたちができるといいなあと思うのですが、もし可能であれば教えていただけると助かります。


WWW WATCH, December 3, 2007 - 10:13.

羊さんコメントありがとうございます。

最も単純な方法でしたら検索時にデータベースとして使用される「search_data.txt」内に対象にしたいブログのデータが入っていればいいということになりますので、例えばMT4なら「MTBlogs」タグや「MTEntries」タグの「blog_ids」アトリビュートなどを使用して複数のブログのデータがデータベースに入るようにしてあげればいいんじゃないでしょうか。

検索結果をブログごとに表示したいとかなると、スクリプトのカスタマイズが必要になりますが。

羊, December 3, 2007 - 22:56.

ありがとうございます。
「search_data.txt」内に全データが入ればいい、なるほどそうですね。
ただ・・・、当方にそこまでできる知識があるかは分からないのですが、また週末にでもチャレンジしてみようと思います。
すばらしい機能なので、何とか活かしたいです。
取り急ぎ、お礼まで。

WWW WATCH, December 3, 2007 - 23:52.

羊さん。細かく説明できなくて申し訳ないです。でも全部のブログを対称にするだけなら簡単ですよ。

もしMT4をお使いなら「search_data.txt」テンプレート内の、

<MTEntries lastn="0">

となっているところを

<MTEntries lastn="0" blog_ids="all">

にしてみてください。これだけで全部のブログのデータがDBに入りますので。

羊, December 4, 2007 - 23:28.

ごていねいに早速のフォローをありがとうございます。
ダメなら別ブログにしていたのをカテゴリにやり直そうかと思っていました・・・。

MT4でないのですが、何も考えず、blog_ids="all"を付け加えてダメ・・・。

MT4にアップするしかないのかと思いながら、
・・・と、MT4が複数ブログ対応を強化したらしいことを思い出して、ならば、とMultiBlogにしてみたらできました!
感動です。

最初はblog_ajax_json_search.js 内の修正が必要なのかと思っていたのですが、search_data.txtの方だったのですね。
簡単なことが頭が回らず、よく考えてみるべきでした。

でも、本当にありがとうございました!

ちなみに、こちらのサイトには去年、エントリーされていた秀丸のhtml_selectマクロがきっかけだったのですが、それも大変、ありがたく活用しています。
非常に重宝しており、編集に役立っています。

post your comment

comment form

* All Fields Required.

RSS Feed
  • Add to Google Reader
  • Add to My Yahoo
  • Add to netvibes
  • Subscribe in NewsGator Online
  • Subscribe in livedoor Reader
  • Subscribe in Hatena RSS Reader
  • Subscribe in Bloglines
  • Feed Count by FeedBurner