記事内のテキストのみを検索する
SearchEntriesプラグインに対して、「記事に含まれるHTMLのタグを除外して、テキストのみを検索したい」というお問い合わせをいただきました。
その方法を紹介します。
考え方
記事をリッチテキストで書くと、HTMLのタグもデータベースに保存されます。
SearchEntriesプラグインは、データベースに保存されている値を検索するので、リッチテキストで書かれた記事だと、HTMLのタグまで検索されてしまいます。
そこで、記事を保存する際に、リッチテキストからHTMLを除去した値を作ってカスタムフィールドに保存します。
そして、そのカスタムフィールドを検索するようにします。
プラグインのインストール
記事を保存すると同時に、カスタムフィールドに自動的に値を設定するために、プラグインを1つインストールします。
以下からファイルをダウンロードします。
ダウンロードしたZipファイルを解凍すると、「plugins」というフォルダができます。このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。
カスタムフィールドの作成
記事の文章からHTMLを除いた値を保存するために、記事に複数行テキスト型のカスタムフィールドを1つ作ります。
既存の記事の文章をカスタムフィールドに保存する
まず、既存の記事の文章からHTMLを除いて、3,で作ったカスタムフィールドに保存します。
インデックステンプレートを1つ新規作成して、以下のようなテンプレートを入力します。
3行目の「ベースネーム」のところは、上の3.で作ったカスタムフィールドのベースネームに置き換えます。
<mt:WholeEntries>
<mt:SetCFBlock class="entry">
<mt:SetCFValueBlock field="ベースネーム"><$mt:EntryBody remove_html="1"$>
<$mt:EntryMore remove_html="1"$></mt:SetCFValueBlock>
</mt:SetCFBlock>
</mt:WholeEntries>
このインデックステンプレートを再構築すると、記事の本文/続きからHTMLを取り除いた値が、カスタムフィールドに保存されます。
カスタムフィールドの保存が終わったら、このインデックステンプレートは削除します。
なお、記事が多くて一度に再構築しきれない場合は、1行目のMTWholeEntriesタグにlimit/offsetモディファイアを指定します。
例えば、「limit="50" offset="100"」とすれば、最新記事から100件スキップして、その次の50件の記事だけが処理の対象になります。
これで、一部の記事だけカスタムフィールドに値を設定することができますので、再構築→offsetモディファイアの書き換えを繰り返して、各記事のカスタムフィールドを順次設定していきます。
記事の新規作成/更新時にカスタムフィールドを設定する
次に、今後に記事を新規作成するときや、既存の記事を更新するときにも、カスタムフィールドに値を設定するようにします。
記事アーカイブテンプレートを1つ新規作成し、以下の内容を入力します。
2行目の「ベースネーム」のところは、上の3.で作ったカスタムフィールドのベースネームに置き換えます。
<mt:SetCFBlock class="entry">
<mt:SetCFValueBlock field="ベースネーム"><$mt:EntryBody remove_html="1"$>
<$mt:EntryMore remove_html="1"$></mt:SetCFValueBlock>
</mt:SetCFBlock>
テンプレートのアーカイブマッピングを設定する際には、「パス」の欄で「カスタム」を選び、パスの入力欄には、ブラウザでアクセスできないディレクトリのファイル名を指定します。
ただし、ウェブサイト(またはブログ)の出力先ディレクトリからの相対パスの形で指定します。
また、ブラウザでアクセスできないディレクトリにファイルを出力できないなら、パスを「null.txt」にでもしておきます。
これだと、ウェブサイト(またはブログ)のディレクトリに「null.txt」という空のファイルが出力されます。
カスタムフィールドを対象に検索する
最後に、SearchEntriesプラグインを使うテンプレートを書き換えて、検索対象として、本文の代わりに、ここまでで作ったカスタムフィールドを使うようにします。