2005-11-11 Fri

ブログを引越ししました。新しいブログもよろしくお願いします。
Heartfield - What’s wrong about feeling good?

NP_SearchedPhrase|キーワード自動挿入のカスタマイズ

検索サイト経由で当サイトに来ると、その時に検索した単語がハイライト表示されます。Google 様のキャッシュページみたいな感じですね。これは「NP_SearchedPhrase」というプラグインを使って実現しています。このプラグインはとても高機能で、検索サイト経由のアクセス数はもちろん、その単語まで記録してくれてとてもおもしろいです。ほんとにありがとうございます。

さて、最近の当サイトは「ASP-2070」で検索してくる人が非常に多いです。最近ちょっと落ち着いたようですが。テレビか何かで紹介されたんですかね? 少しでもお役にたっていたら僕としても嬉しいのですが。

ということで、ひっそりとしていた当サイトも一時的ではあれ賑わったので、検索キーワードランキングを表示するようにしました。トップページはサイト全体、個別アイテムページはそのページに来た時のキーワードを表示しています。これももちろん「NP_SearchedPhrase」で実現しています。いや、ほんと高機能です。今までハイライト表示にしか使ってなかったのですが、これを機にいろいろカスタマイズしたのでメモしておきます。…また長くなりそうです。

「<%SearchedPhrase%>」は直前に検索した単語を挿入する変数です。もちろん、検索サイト経由でやって来た場合のみ。今まで使い方がわからなかったのですが、higuchi さんの説明をよく読むと確かに便利そう。ということで当サイトでは、Nucleus の検索入力欄と Google の検索入力欄に表示させています。なんで「2つも検索機能つけとんねん?」と思われるかもしれませんが、アサマシイ理由がないわけではないですが(笑)どちらの検索機能も足りない部分があるので、補完目的で使ってます。その理由は今回割愛。

で、検索サイト経由の場合はキーワード挿入でなんら問題ないのですが、普通にブックマーク等から来られた場合には何も表示されません。当サイトは前述のように入力欄が二つあり、これまたアサマシイ理由で Google のロゴを差し替えたので、Nucleus の検索入力欄には「Heartfield」、Google の入力蘭には「Google」と表示させたいと思いました。これが相当猛烈苦労したのですが、勘が良かったのでしょうか。なんとかなりました。

ちょっと入れ子になってるというか、まあややこしいのですが「function doSkinVar」の一番下らへん、135行目ぐらいに

case 'query':
default:

という個所があります。この上にもいろんな「case」がありますが、そこらを考慮すると「<%SearchedPhrase(オプション)%>」にオプション指定がある場合の各挙動を指示しているようです。「default」というのは、なんの指定もない場合、すなわち「<%SearchedPhrase%>」のみの場合ですよね。「case 'query':」のすぐ下に「default」が来ているということは、「<%SearchedPhrase(query)%>」としてもなんの影響もないのでしょう。というか「case 'hoge':」が無い限り「<%SearchedPhrase(hoge)%>」としてもなんの影響もないと。「いろんなケースがあるけど、こっちが指定してないのはなんでもかんでも default にしますよ」っていう意味ですよね、多分。このような結論に至るまで、かなりの試行錯誤があったのですが、結果としてこうなりました。

case 'query':
	if (htmlspecialchars($pageReferer->cQueryString) == '') {
		echo 'Nucleus Search';
	} else {
		echo htmlspecialchars($pageReferer->cQueryString);
	}
	break;
default:
	if (htmlspecialchars($pageReferer->cQueryString) == '') {
		echo 'Google Search';
	} else {
		echo htmlspecialchars($pageReferer->cQueryString);
	}

詳しい仕組みはまったく理解できてませんが、検索サイト経由でない場合「htmlspecialchars($pageReferer->cQueryString);」は空になります。だったら空の場合に文字列を入れちゃえ、ということで、if 文を追加。「<%SearchedPhrase%>」の時は「Google」とします。で、使用されていなかった「query」の場合、つまり「<%SearchedPhrase(query)%>」とされた場合は「Heartfield」としました。なんかもっとスマートにできるような気がしないでもないですが、僕ではこれが限界でした。

後は、Google 提供の検索ソースに手を入れますが、これもまたちょっとややこしいことしてます。理由は察して欲しいのですが、こう記述してます。

<input type="text" name="q" class="formfield" maxlength="255" <%if(skintype,search)%>value="<%query%>" onfocus="if (this.value == '<%query%>') this.value = '';" onblur="if (this.value == '') this.value = '<%query%>';"<%else%>value="<%SearchedPhrase%>" onfocus="if (this.value == '<%SearchedPhrase%>') this.value = '';" onblur="if (this.value == '') this.value = '<%SearchedPhrase%>';"<%endif%> />

なんか Nucleus の if 文とか使ってますね。簡単にいえば、Nucleus の検索機能を使ったページを表示する際には、Nucleus に渡された検索キーワードを Google の検索入力欄にも表示させているわけです。なんか適当に検索してもらえばわかると思いますので、いっかいやっちゃってください。javascript なんかもありますが、これは「Nucleus.skooler.org」さんを参考に─というかまんまなんですが─しました。skooler さんのサイトのコメント欄を初めてみた時に「わお!」と感動したもので…はっきりいって、当サイトは dj.krist さんに相当烈お世話になっています。ほんとにありがとうございます。

さて、後は仕上げに Nucleus 標準の検索入力欄を次のように変更します。

<input name="query" class="formfield" maxlength="60" accesskey="4" <%if(skintype,search)%>value="<%formdata(query)%>" onfocus="if (this.value == '<%formdata(query)%>') this.value = '';" onblur="if (this.value == '') this.value = '<%formdata(query)%>';"<%else%>value="<%SearchedPhrase(query)%>" onfocus="if (this.value == '<%SearchedPhrase(query)%>') this.value = '';" onblur="if (this.value == '') this.value = '<%SearchedPhrase(query)%>';"<%endif%> />

Google の時と同じく、if 文でスキンタイプによって表示を変えています。検索ページ以外は「<%SearchedPhrase(query)%>」としてますね。つまり、検索サイト経由ではない場合「Heartfield」と表示するということですね。

まあいろいろやっちゃってますが、もうここまでやるとサイト訪問者の為、というよりも完全なる自己満足です。もし、このカスタマイズを施される方は、自己責任でお願いします。まちがっても higuchi さんに質問されませんよう。もちろん、僕でわかればお答えしますが、僕はド素人、勘もしくはフィーリングでソースをいじる人間ですので、危険です。

他にもまだ検索されていない記事の場合も改造したのですが、あまりに長い記事なったので別の記事にします。…文章まとめられない。つうか話をあっちゃこっちゃにもっていきすぎなんだな…

Tag: /

2005-11-11 Fri / Category - Nucleus / Comment - 0 / TrackBack - 0

「NP_SearchedPhrase|キーワード自動挿入のカスタマイズ」へのトラックバック

TrackBack URL:

「NP_SearchedPhrase|キーワード自動挿入のカスタマイズ」へのコメント





このページの先頭に戻る

Copyright 2005 - Heartfield