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

SearchEntriesプラグインを、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)を組み合わせると、検索フォームでの動的な検索結果もページ分割することもできます。

1.検索フォームの作り方

検索フォームの作り方は、これまでに解説してきた方法とほぼ同じです。
ただし、フォーム(<form・・・>~</form>)の中に、以下のタグを追加する必要があります。

<input type="hidden" name="first_time" value="1" />

例えば、ブログ記事のタイトルで検索するフォームを作る場合だと、以下のようにform要素の部分を作ります。

<form name="srh" method="get" action="<$mt:RealtimeRebuildCGIPath$>">
  <p>
    <label for="title">キーワード</label><br />
    <input type="text" id="title" name="title" />
  </p>
  <p>
    <input type="submit" name="submit" value="送信" />
  </p>
  <input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
  <input type="hidden" name="tmpl_id" value="<$mt:GetTemplateID tmpl_name="詳細検索結果"$>" />
  <input type="hidden" name="first_time" value="1" />
</form>

なお、このフォームを含むテンプレートの例は、以下のリンクからダウンロードすることができます。

検索結果をページ分割する場合の検索フォームテンプレートの例

2.検索結果テンプレートの作り方

次に、これまでの動的検索と同様に、検索結果を出力するためにテンプレートモジュールを作成し、その中にSearchConditionsタグのブロック等を入れます。
ページ分割を行う場合、検索結果テンプレートの中で、検索を行う部分は、以下のように書きます。

<$mt:GetQueryParamsToVars$>
<mt:If name="qp_first_time">
  <$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:Else>
  <$mt:SetVar name="set_only" value="1"$>
  <mt:DivPagesInit>
</mt:If>
<mt:SearchConditions count_only="$count_only" set_only="$set_only">
  検索条件を表すテンプレートタグ
  <$mt:SearchLimit limit="$dp_per_page"$>
  <$mt:SearchOffset offset="$dp_offset"$>
</mt:SearchConditions>
<mt:If name="qp_first_time">
  <mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</mt:If>

4行目の「1ページあたりの出力件数」の箇所で、検索結果の1ページに出力するブログ記事の件数を指定します。
また、11行目の「検索条件を表すテンプレートタグ」の部分に、MTSearchCondition系の各種のタグを書いて、検索条件を指定します。

例えば、以下のような場合を考えます。

  • 手順1.のフォームのように、ブログ記事のタイトルで検索したいとします。
  • タイトルの入力欄のname属性を「title」にしているとします。
  • 検索結果は1ページあたり10件ずつ出力したいとします。

この場合、検索を行う部分は以下のように書きます。

<$mt:GetQueryParamsToVars$>
<mt:If name="qp_first_time">
  <$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:Else>
  <$mt:SetVar name="set_only" value="1"$>
  <mt:DivPagesInit>
</mt:If>
<mt:SearchConditions count_only="$count_only" set_only="$set_only">
  <$mt:SearchConditionLike field="title" values="$qp_title"$>
  <$mt:SearchLimit limit="$dp_per_page"$>
  <$mt:SearchOffset offset="$dp_offset"$>
</mt:SearchConditions>
<mt:If name="qp_first_time">
  <mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</mt:If>

3.検索結果の出力

検索結果を出力する方法は、静的に検索してページ分割する場合と同じです。
具体的な手順は、静的なページ分割の場合の「3.検索結果の出力」を参照してください。

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

ページ移動リンクを出力する方法は、静的に検索してページ分割する場合とほぼ同じです。
具体的な手順は、静的なページ分割の場合の「4.ページ移動リンクの出力」を参照してください。

だたし、リンクのアドレスを変数に代入する処理が、以下のように変わります。

<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" build_params="1" name="検索フォームの各要素のname属性"$>&amp;page=</mt:SetVarBlock>

「検索フォームの各要素のname属性」の部分には、検索フォーム内で検索条件の入力に使っている各要素のname属性を、コンマで区切って並べます。
また、「テンプレート名」には、検索結果表示テンプレートの名前を入れます。

例えば、手順1.の検索フォームだと、検索フォーム内には、キーワードを入力する欄があり、そのname属性が「title」になっています。
検索結果を「詳細検索結果」というテンプレートに沿って出力するなら、MTSetVarBlockタグを以下のように書きます。

<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="詳細検索結果" build_params="1" name="title"$>&page=</mt:SetVarBlock>

なお、手順2.~手順4.を含む検索結果テンプレートの例は、以下のリンクからダウンロードすることができます。

検索結果をページ分割する場合の検索結果テンプレートの例

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

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

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

6.検索結果ページのキャッシュ

静的な検索結果をページ分割する場合と同様に、検索フォームを使った検索結果をページ分割する場合でも、検索結果のページをキャッシュすることができます。
ただし、その手順は静的な検索結果のページ分割とはやや異なります。
手順は後日解説します。

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

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

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください