はじめての DynamicMTML #13 - 指定期間内の記事をリストアップする

今回は、MTSearchEntries を使って、指定期間内の記事をリストアップする方法を紹介します。

指定期間を設定する際に、開始日などは PHP の data 関数等を使うと楽に求められます。しかし、今回紹介する方法は、MT のテンプレート内に直接 PHP のコードを書くという MT らしからぬ方法かもしれませんが、時としてそれもメリットの1つになるかもしれません。

DynamicPHPFirst を有効にする

DynamicPHPFirst は、DynamicMTML がファイルを処理する際に、MT タグを処理する前に PHP のコードを実行するようにする環境変数です。mt-config.cgi に次の1行を追加すればOKです。

DynamicPHPFirst 1

この環境変数の詳細は、「はじめての DynamicMTML #11 - MT タグの中で PHP を実行する」を参照してください。

なお、厳密に言うと、これから紹介するコードは DynamicPHPFirst 1 を設定しなくても動作します。PHP の出力結果を SetVarBlock タグで MT の変数に渡しているところがポイントです。

過去3ヶ月間の記事をリストアップ

過去3ヶ月間というのは、「先々月の今日」以降のブログ記事ということになります。これを実現するコードは次の通りです。

<mt:DynamicMTML>
<mt:BlogID setvar="blog_id">
<mt:SetVarBlock name="from"><?php print date('Y-m-d', mktime('0', '0','0', date('m') - 3, date('d'), date('Y') ) ); ?></mt:SetVarBlock>
<mt:SearchEntries query="$from" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999">
<mt:Include module="ブログ記事の概要">
</mt:SearchEntries>
</mt:DynamicMTML>

まず、PHP の date 関数mktime 関数を使って、3ヶ月前の今日を 2012-02-07 のフォーマットで取得しています。それを MTSetVarBlock タグで変数 from にセットしています。

そして、MTSearchEntries タグに次表のようにモディファイアを設定して、該当するブログ記事をリストアップします。

なお、authored_on は、データベースには「2012-02-07 12:53:06」というフォーマットで保存されていますが、検索クエリ側で「2012-02-07」のように時分秒を省略した場合は、「2012-02-07 00:00:00」として検索されるようです。

query 変数 from(PHP で取得した3ヶ月前の今日の日付)
target authored_on(ブログ記事の公開日)。このように、mt_entry テーブルにあるフィールドから「entry_」を除いた形で設定できます。
operator ここでは「>」(より大きい)を指定します。
blog_id 変数 blog_id(ブログのID)
lastn 9999。今回は、該当するすべての件数を出力したかったので、9999 としています。MTEntries の lastn は「0」を設定すれば全ての記事が取得できますが、MTSearchEntries は本当に 0 になってしまうので注意してください。

 今月と先月の記事をリストアップ

未来の日付で公開している記事はないという前提ですが、「今月と先月」というのは、「1ヶ月前の1日」以降のブログ記事ということになります。これを実現するコードは次の通りです。

<mt:DynamicMTML>
<mt:BlogID setvar="blog_id">
<mt:SetVarBlock name="from"><?php print date('Y-m-d', mktime('0', '0','0', date('m') - 1, 1, date('Y') ) ); ?></mt:SetVarBlock>
<mt:SearchEntries query="$from" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999">
<mt:Include module="ブログ記事の概要">
</mt:SearchEntries>
</mt:DynamicMTML>

mktime 関数のパラメータを少し変えるだけです。

特定の期間の記事をリストアップ

先月と先々月のブログ記事

例えば、「先月」と「先々月」という特定の2ヶ月間のブログ記事だけを表示したいとします。

MTSearchEntries では、unique モディファイアに 1 を設定すると、「同じテンプレートで一度 MTSearchEntries で出力したブログ記事は除く」という動作になります。

したがって、「先月」と「先々月」だけをリストアップしたい場合は、はじめに「今月」の記事を MTSearchEntries タグで扱っておいて、その後で「先々月」の1日以降のブログ記事を、unique="1" でリストアップすればよいということになります。

これを実現するためのコードは次のようになります。

<mt:DynamicMTML>
<mt:BlogID setvar="blog_id">
<mt:SetVarBlock name="from"><?php print date('Y-m-d', mktime('0', '0','0', date('m'), 1, date('Y') ) ); ?></mt:SetVarBlock>
<mt:SearchEntries query="$from" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999">
</mt:SearchEntries>

<mt:SetVarBlock name="from"><?php print date('Y-m-d', mktime('0', '0','0', date('m') - 2, 1, date('Y') ) ); ?></mt:SetVarBlock>
<mt:SearchEntries query="$from" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999" unique="1">
<mt:Include module="ブログ記事の概要">
</mt:SearchEntries>
</mt:DynamicMTML>

特定の日付間のブログ記事

この方法を利用すれば、日付を指定した特定の期間を出力することも可能です。例えば「2011年の12月29日〜2012年1月3日の冬休みの間に書いたブログ記事一覧」というのも次のように簡単に取り出せます。

<mt:DynamicMTML>
<mt:BlogID setvar="blog_id">
<mt:SearchEntries query="2012-01-04" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999">
</mt:SearchEntries>

<mt:SearchEntries query="2011-12-29" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999" unique="1">
<mt:Include module="ブログ記事の概要">
</mt:SearchEntries>
</mt:DynamicMTML>

特定の日付間のブログ記事をより柔軟に取り出す

また、「はじめての DynamicMTML #10 - クエリを処理する4つのテンプレートタグ」で紹介している MTQuery タグを使えば、より一層ダイナミックに日付指定で記事一覧を作成することができます。

例えば、簡単なフォームを設置し、次のような URL を発行するとします。

http://www.tinybeans.info/first_dynamic/blog1/search.html?from=2011-12-29&to=2012-01-03

この場合、search.html に次のようなテンプレートを書いておけば、先ほどの「2011年の12月29日〜2012年1月3日の冬休みの間に書いたブログ記事一覧」の例と同様の記事一覧を取得することができます。

<mt:DynamicMTML>
<$mt:Query key="from" setvar="from"$>
<$mt:Query key="to" cat=" 23:59:59" setvar="to"$>
<mt:BlogID setvar="blog_id">
<mt:SearchEntries query="$to" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999">
</mt:SearchEntries>

<mt:SearchEntries query="$from" target="authored_on" operator=">" blog_id="$blog_id" lastn="9999" unique="1">
<mt:Include module="ブログ記事の概要">
</mt:SearchEntries>
</mt:DynamicMTML>

以上です。

なお、藤本さんの「PHPUtilプラグイン」を利用すれば、上記のような日時指定の記事一覧を、プラグインで拡張された MT タグで出力することができます。そちらの方が、MT 的な書き方ができます。

詳細は以下のページをご覧ください。

  • このエントリーをはてなブックマークに追加
Just a second...