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

ブログ記事の公開日時など、検索フォームで日付を指定して検索したい場合もあります。
今回は、「○○年□□月の記事」のように、ある1つの日付を入力して検索する方法を解説します。

日付で検索

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

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

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

まず、検索フォームを作ります。

SearchEntriesプラグインで日付のフィールドを検索する場合、MTSearchConditionCompareタグやMTSearchConditionCFCompareタグを使って、「ge="範囲の最初の日時"」と「le="範囲の最後の日時"」で日付の範囲を指定します。
日時は「年月日時分秒」を連結した14桁の数値で表します。

一方、検索フォーム側では、年月日時分秒まですべて入力することは、通常はありません。
例えば、今取り上げている例のように、年と月だけを入力することが多いと思います。
そこで、フォームで入力された年等を元に、ge/leモディファイアで使う14桁の数値を求められるようにします。

冒頭の画面のように、年月日時分秒を別々の入力要素で入力する場合、個々の入力要素のname属性を「名前_接尾語」のような形にします。
「名前」の部分には、共通の名前を指定します。
また、接尾語は以下のように付けます。

入力要素接尾語
year
month
day
hour
minute
second

例えば、冒頭の画面のように、2つのselectで年と月を入力できるようにするとします。
また、それらのselectのname属性のうち、「名前」に当たる部分を「edate」にするとします。
この場合の検索フォームの組み方は、以下のようになります。

<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 id="edate_year" name="edate_year">
      <option value="2008">2008</option>
      <option value="2009">2009</option>
      <option value="2010">2010</option>
    </select>
    <label for="edate_year">年</label>
    <select id="edate_month" name="edate_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="edate_month">月</label>
  </p>
  <p>
    <input type="submit" value="送信" />
  </p>
</form>

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

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

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

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

2-1.MTGetParamToDateタグ

まず、検索フォームで入力された年等の情報から、検索で使う14桁の数値を作ります。
それには、「MTGetParamToDate」というテンプレートタグを使います。
このテンプレートタグが処理されると、期間の最初/最後を表す14桁の数値が生成され、変数に代入されます。

<$mt:GetParamToDate field="フィールド名" range="期間"$>

fieldモディファイアには、検索フォームの日付入力欄のname属性の値のうち、「_year」等を除いた共通部分を指定します。
例えば、1.で作った検索フォームの場合だと、name属性を「edate_XXX」のような値にしていました。
したがって、fieldモディファイアには「field="edate"」と指定します。

また、rangeモディファイアでは、どの期間の数値に変換するかを、以下の表から指定します。

変換先の期間指定する値
year
month
day
hour
minute
second

例えば、1.で作った検索フォームの場合だと、年と月を入力するようにしていますので、変換先の14桁の数値も、その年/月の最初と最後を表す値にします。
したがって、「range="month"」と指定します。

変換した結果は、「qp_フィールド名_s」と「qp_フィールド名_e」の2つの変数に代入されます。
「フィールド名」の部分は、「field="フィールド名"」のモディファイアで指定した値になります。
「・・・_s」の変数には、期間の最初の日時を表す数値が代入されます。
また、「・・・_e」の変数には、期間の最後の日時を表す数値が代入されます。

例えば、「<$mt:GetParamToDate field="edate" range="month"$>」としたとします。
この場合、「qp_edate_s」と「qp_edate_e」の2つの変数が定義されます。
変数qp_edate_sには、フォームで入力された年/月の最初に対応する値が代入されます。
また、変数qp_edate_eには、フォームで入力された年/月の最後に対応する値が代入されます。
検索フォームで年/月として2010/5が選ばれた場合だと、これらの変数の値は、それぞれ以下のようになります。

変数
qp_edate_s20100501000000
qp_edate_e20100531235959

2-2.MTSearchConditionsタグのブロックを作る

次に、MTGetParamToDateタグで変換した結果を使って、MTSearchConditionsタグのブロックを作り、日付の条件を指定します。

例えば、2-1.で解説した例だと、変数qp_edate_sとqp_edate_eに、月の最初/最後を表す14桁の数値が入っています。
そこで、MTSearchConditionsCompareタグやMTSearchConditionsCFCompareタグを使って、これら2つの変数で検索範囲の下限/上限を指定します。

「○○○○年□□月に公開された」という条件でブログ記事を検索する場合だと、ブログ記事の公開日時のフィールド(authored_onフィールド)に対して、MTSearchConditionCompareタグで条件を設定します。
実際にMTSearchConditionsタグのブロックを組むと、以下のようになります。

<$mt:GetQueryParamsToVars$>
<$mt:GetParamToDate field="edate" range="month"$>
<mt:SearchConditions>
  <$mt:SearchConditionCompare field="authored_on" ge="$qp_edate_s" le="$qp_edate_e"$>
</mt:SearchConditions>

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

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

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

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

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