ブログ記事詳細検索プラグイン(その29・検索結果のページ分割/静的な検索の場合)

SearchEntriesプラグインは、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)を組み合わせることで、検索結果をページ分割することもできます。
今日は、検索フォームを使わずに、検索条件を静的に指定する場合のページ分割の方法を解説します。

1.プラグインのインストール

前述したように、ページ分割を行うには、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)が必要です。
また、リアルタイム再構築プラグインを動作させるには、RebuildHelperプラグインも必要です。
まず、これらのプラグインをインストールします。

各プラグインは、以下からダウンロードします。

各プラグインとも、Zipファイルを解凍すると「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。

その後、Movable Typeのインストール先→「plugins」ディレクトリ→「RealtimeRebuild」ディレクトリにある「mt-realtime-rebuild.cgi」ファイルのパーミッションを705等に変えて、実行可能にします。

なお、すでに各プラグインをインストールされている方もいらっしゃるかと思います。
ただし、バージョンが上がっていますので、古いバージョンをお使いの方は、上記のバージョンのプラグインをインストールしてください。

2.検索部分の作り方

次に、インデックステンプレートを作り、その中に検索部分(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>

3.検索結果の出力

次に、検索結果を出力する部分を作ります。

前述の検索では、検索されたブログ記事はまだ読み込まれていません。
そこで、「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>

4.ページ移動リンクの出力

最後に、ページ移動のリンクを出力します。
ページ番号一覧と、前後および最初/最後のページへのリンクを並べて出力するなら、以下のようにタグを組みます。
2行目の「テンプレート名」のところには、検索部分を含むテンプレートの名前を入れます。

<mt:DivPagesIfMulti>
  <mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" tmpl_type="index"$>&amp;page=</mt:SetVarBlock>
  <p>
  <mt:DivPagesIfPrevPage>
    <a href="<$mt:GetVar name="pager_link"$>1">&laquo; 最初</a>
    <a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesPrevPageNumber$>">&lt; 前</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$>">次 &gt;</a>
    <a href="<$mt:GetVar name="pager_link"$><$mt:DivPagesLastPageNumber$>">最後 &raquo;</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"$>&amp;page=</mt:SetVarBlock>

5.リアルタイム再構築の許可

テンプレートを作り終わったら、このテンプレートのリアルタイム再構築を許可します。
手順は以下の通りです。

  • ブログの「ツール」→「プラグイン」メニューを選びます。
  • プラグイン一覧の中で、「RealtimeRebuild」の「設定」のタブを開きます。
  • 「再構築を許可するテンプレート」の欄で、ここまでで作ったインデックステンプレートのチェックをオンにします。
  • 「変更を保存」ボタンをクリックします。

6.サンプルファイル

ここまでで作った検索のサンプルファイルは、以下からダウンロードすることができます。

検索条件を静的に指定する場合のページ分割の例

インデックステンプレートを作成し、ダウンロードしたファイルの内容を貼り付けて、テンプレート名を「静的ページ分割」にして保存してください。

7.SearchEntriesプラグイン関係の記事の一覧

SearchEntriesプラグイン関係のその他の記事は、以下のリンクから参照できます。