日付で検索
ブログ記事の公開日時など、検索フォームで日付を指定して検索したい場合もあります。
今回は、「○○年□□月の記事」のように、ある1つの日付を入力して検索する方法を解説します。
以下のような事例を基に解説します。
- 「○○○○年□□月に公開された」という条件でブログ記事を検索します。
- 検索結果表示用のテンプレートモジュールには、「詳細検索結果」という名前を付けるものとします。
- 年および月をselectで選べるようにします。
検索フォームの作り方
まず、検索フォームを作ります。
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>
検索結果テンプレートの作り方
次に、検索結果テンプレートを作ります。
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_s | 20100501000000 |
qp_edate_e | 20100531235959 |
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>