ブログ記事詳細検索プラグイン(その23・検索フォーム/検索結果表示の事例・期間で検索)

検索フォームで、日付の期間を指定して検索したい場合もあります。
今回は、「○○年□□月~●●年■■月の記事」のように、日付を2つ入力して、その期間に該当するブログ記事検索する方法を解説します。

日付の期間で検索

以下のような事例を基に解説します。

  • 「○○○○年□□月~●●●●年■■月に公開された」という条件でブログ記事を検索します。
  • 検索結果表示用のテンプレートモジュールには、「詳細検索結果」という名前を付けるものとします。
  • 年および月をselectで選べるようにします。

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

まず、検索フォームを作ります。
日付を1つだけ入力する場合と同様に、年や月などを入力する要素では、name属性の先頭部分を共通にし、その後に「_year」等の接尾語を付けます。
また、期間の最初と最初のそれぞれで、name属性の先頭部分を別にします。

今取り上げている例だと、期間の最初/最後を入力する要素で、name属性の先頭部分を、それぞれedate1/edate2にすることにします。
実際に検索フォームを作ると、以下のようになります。

<form method="get" action="<$mt:RealtimeRebuildCGIPath$>">
  <input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
  <input type="hidden" name="tmpl_id" value="<$mt:GetTemplateID tmpl_name="詳細検索結果"$>" />
  <p>
    <select name="edate1_year">
      <option value="2008">2008</option>
      <option value="2009">2009</option>
      <option value="2010">2010</option>
    </select>
    <label for="edate1_year">年</label>
    <select name="edate1_month">
    <mt:For var="m" from="1" to="12">
      <option value="<$mt:GetVar name="m"$>"><$mt:GetVar name="m"$></option>
    </mt:For>
    </select>
    <label for="edate1_year">月</label>
    ~
    <select name="edate2_year">
      <option value="2008">2008</option>
      <option value="2009">2009</option>
      <option value="2010">2010</option>
    </select>
    <label for="edate2_year">年</label>
    <select name="edate2_month">
    <mt:For var="m" from="1" to="12">
      <option value="<$mt:GetVar name="m"$>"><$mt:GetVar name="m"$></option>
    </mt:For>
    </select>
    <label for="edate2_year">月</label>
  </p>
  <p>
    <input type="submit" value="送信" />
  </p>
</form>

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

期間で検索する場合の検索フォームテンプレートの例

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

次に、検索結果テンプレートを作ります。

フォームで入力された日付は、日付を1つだけ入力する場合と同様に、MTGetParamToDateタグを使って、14桁の数値に変換します。
入力された年/月等から、その最初の日の0時0分0秒を表す14桁の数値を得るには、以下のように書きます。

<$mt:GetParamToDate field="フィールド名" start="日時"$>

fieldモディファイアには、検索フォームの日付入力欄のname属性の値のうち、「_year」等を除いた共通部分を指定します。
また、startモディファイアの「日時」には、以下の値を指定します。

変換先の日時指定する値
year
month
day
hour
minute
second

変換後の日付は、名前が「qp_フィールド名」の変数に代入されます。

同様に、入力された年/月等から、その最後の日の23時59分59秒を表す14桁の数値を得るには、以下のように書きます。

<$mt:GetParamToDate field="フィールド名" end="日時"$>

1.で作った検索フォームを元に検索する場合、「edate1」で入力された年/月が期間の最初で、「edate2」で入力された年/月が期間の最後です。
したがって、「<$mt:GetParamToDate field="edate1" start="month"$>」と「<$mt:GetParamToDate field="edate2" end="month"$>」のタグで、期間の最初/最後の日付を14桁の数値に変換します。
また、変換後の数値は、変数qp_edate1/qp_edate2に代入されます。
例えば、期間の最初/最後の入力欄で、2010年1月と2010年5月が選択された場合、変数qp_edate1/qp_edate2の値は、それぞれ以下のようになります。

変数
qp_edate120100101000000
qp_edate220100531235959

ここまでの話にそって、検索結果を出力する部分を作ると、以下のようになります。

<$mt:GetQueryParamsToVars$>
<$mt:GetParamToDate field="edate1" start="month"$>
<$mt:GetParamToDate field="edate2" end="month"$>
<mt:SearchConditions>
  <$mt:SearchConditionCompare field="authored_on" ge="$qp_edate1" le="$qp_edate2"$>
</mt:SearchConditions>
<mt:IfNonZero tag="SearchLoadedEntryCount">
  <p><$mt:SearchLoadedEntryCount$>件</p>
  <mt:Entries>
    <$mt:Include module="ブログ記事の概要"$>
  </mt:Entries>
<mt:Else>
  <p>条件に合う記事がありませんでした。</p>
</mt:IfNonZero>

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

期間で検索する場合の検索結果表示テンプレートの例

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

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

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