静的な検索の場合
SearchEntriesプラグインは、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)を組み合わせることで、検索結果をページ分割することもできます。
検索フォームを使わずに、検索条件を静的に指定する場合のページ分割の方法を解説します。
プラグインのインストール
前述したように、ページ分割を行うには、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)が必要です。
また、リアルタイム再構築プラグインを動作させるには、RebuildHelperプラグインも必要です。
まず、これらのプラグインをインストールします。
各プラグインは、以下からダウンロードします。
各プラグインとも、Zipファイルを解凍すると「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。
その後、Movable Typeのインストール先→「plugins」ディレクトリ→「RealtimeRebuild」ディレクトリにある「mt-realtime-rebuild.cgi」ファイルのパーミッションを705等に変えて、実行可能にします。
なお、すでに各プラグインをインストールされている方もいらっしゃるかと思います。
ただし、バージョンが上がっていますので、古いバージョンをお使いの方は、上記のバージョンのプラグインをインストールしてください。
検索部分の作り方
次に、インデックステンプレートを作り、その中に検索部分(MTSearchConditionsタグのブロック)を入れます。
ただし、ページ分割に対応させるために、タグの組み方が幾分変わります。
以下のようにタグを組みます。
<mt:IfRealtimeRebuild>
<$mt:SetVar name="set_only" value="1"$>
<mt:DivPagesInit>
<mt:Else>
<$mt:SetVar name="count_only" value="dp_total_count"$>
<$mt:SetVar name="dp_per_page" value="1ページあたりの出力件数"$>
<$mt:SetVar name="dp_offset" value="0"$>
</mt:IfRealtimeRebuild>
<mt:SearchConditions count_only="$count_only" set_only="$set_only">
検索条件を表す各種のタグ
<$mt:SearchLimit limit="$dp_per_page"$>
<$mt:SearchOffset offset="$dp_offset"$>
</mt:SearchConditions>
<mt:IfNoRealtimeRebuild>
<mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</mt:IfNoRealtimeRebuild>
6行目の「1ページあたりの出力件数」には、分割後の各ページに出力するブログ記事の件数を指定します。
また、10行目の「検索条件を表す各種のタグ」の部分には、SearchEntriesプラグインの各種の検索条件設定のタグを指定します。
例えば、タイトルに「Movable Type」を含むブログ記事を検索し、1ページあたり10件ずつ出力したいとします。
この場合、検索部分を組むと以下のようになります。
<mt:IfRealtimeRebuild>
<$mt:SetVar name="set_only" value="1"$>
<mt:DivPagesInit>
<mt:Else>
<$mt:SetVar name="count_only" value="dp_total_count"$>
<$mt:SetVar name="dp_per_page" value="10"$>
<$mt:SetVar name="dp_offset" value="0"$>
</mt:IfRealtimeRebuild>
<mt:SearchConditions count_only="$count_only" set_only="$set_only">
<$mt:SearchConditionLike field="title" values="Movable Type"$>
<$mt:SearchLimit limit="$dp_per_page"$>
<$mt:SearchOffset offset="$dp_offset"$>
</mt:SearchConditions>
<mt:IfNoRealtimeRebuild>
<mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</mt:IfNoRealtimeRebuild>
検索結果の出力
次に、検索結果を出力する部分を作ります。
前述の検索では、検索されたブログ記事はまだ読み込まれていません。
そこで、「MTLoadSearchedEntries」というテンプレートタグで、検索結果を読み込みます。
その後にMTSearchLoadedEntriesタグのブロックを入れて、読み込んだブログ記事を順次出力します。
ただし、検索にヒットする記事がまったくないこともあり得ます。
そこで、MTSearchLoadedEntriesタグのブロックを、「<mt:IfNonZero tag="SearchLoadedEntryCount">」と「</mt:IfNonZero>」のタグで囲みます。
例えば、見つかったブログ記事のタイトルの一覧を出力するなら、以下のようにタグを組むことが考えられます。
<$mt:LoadSearchedEntries$>
<mt:IfNonZero tag="SearchLoadedEntryCount">
<ul>
<mt:SearchLoadedEntries>
<li><$mt:EntryTitle$></li>
</mt:SearchLoadedEntries>
</ul>
<mt:Else>
<p>記事が見つかりませんでした。</p>
</mt:IfNonZero>
ページ移動リンクの出力
最後に、ページ移動のリンクを出力します。
ページ番号一覧と、前後および最初/最後のページへのリンクを並べて出力するなら、以下のようにタグを組みます。
2行目の「テンプレート名」のところには、検索部分を含むテンプレートの名前を入れます。
<mt:DivPagesIfMulti>
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" tmpl_type="index"$>&page=</mt:SetVarBlock>
<p>
<mt:DivPagesIfPrevPage>
<a href="<$mt:GetVar name="pager_link"$>1">« 最初</a>
<a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesPrevPageNumber$>">< 前</a>
</mt:DivPagesIfPrevPage>
<mt:DivPagesLoop>
<mt:DivPagesIfCurPage>
<$mt:DivPagesNumber$>
<mt:Else>
<a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesNumber$>"
<$mt:DivPagesNumber$></a>
</mt:DivPagesIfCurPage>
</mt:DivPagesLoop>
<mt:DivPagesIfNextPage>
<a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesNextPageNumber$>">次 ></a>
<a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesLastPageNumber$>">最後 »</a>
</mt:DivPagesIfNextPage>
</p>
</mt:DivPagesIfMulti>
また、PHPが使える環境なら、検索結果をキャッシュすることもできます。
その場合は、2行目のMTSetVarBlockタグを以下のように書きます。
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesPHPLink tmpl_name="RealtimeRebuild" tmpl_type="index" expire_modified="1"$>&page=</mt:SetVarBlock>
リアルタイム再構築の許可
テンプレートを作り終わったら、このテンプレートのリアルタイム再構築を許可します。
手順は以下の通りです。
- ブログの「ツール」→「プラグイン」メニューを選びます。
- プラグイン一覧の中で、「RealtimeRebuild」の「設定」のタブを開きます。
- 「再構築を許可するテンプレート」の欄で、ここまでで作ったインデックステンプレートのチェックをオンにします。
- 「変更を保存」ボタンをクリックします。