「WordPressで学ぶPHP(3)関数編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」の続編にあたり、PHP組み込みの関数や、独自の関数を作る方法などを解説します。
Kindle本で、定価400円です。
日本の祝日を判定/表示するプラグイン
Movable Typeでカレンダー等を作るときに、祝日かどうかを判定したい場合があります。
過去にいくつかの方法が紹介されていますが、内容が古かったり、汎用的でなかったりと、個人的に「これ」と言えるものがありませんでした。
そこで、日本の祝日を判定したり、祝日名を表示したりするプラグインを作りました。
スタティック/ダイナミックの両方に対応しています。
1.インストール
プラグインは以下からダウンロードします。
ダウンロードしたZipファイルを解凍すると、「plugins」フォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。
2.使い方
このプラグインをインストールすると、以下の2つのテンプレートタグが追加されます。
2-1.MTIfJPHolidayタグ
ある日付が祝日であるかどうかを判断するブロックタグです。
日付は「ts」か「tag」のモディファイアで指定するか、後述するMTJPHolidayDefaultTagタグで指定します。
tsモディファイアでは、「ts="20130620123456"」のように、年/月/日/時/分/秒を連結した14桁の数値を指定します。
また、tagモディファイアでは「tag="EntryDate"」のように、判断対象のテンプレートタグの名前を指定します(ただし、先頭の「MT」はつけません)。
ts/tagの両方のモディファイアを指定した場合は、tsモディファイアが優先されます。
ts/tagの両方のモディファイアを省略し、かつMTJPHolidayDefaultTagタグでテンプレートタグを指定している場合は、そのタグの日付が使われます。
それ以外の場合は、スタティックパブリッシングでは、再構築時点の日付が判断対象になります。また、ダイナミックパブリッシングでは、ページにアクセスがあった時点の日付が判断対象になります。
2-2.MTJPHolidayNameタグ
ある日付が祝日である場合、その祝日の名前を出力するファンクションタグです。
振替休日の場合は「振替」と出力します。
平日であれば何も出力しません。
日付は「ts」か「tag」のモディファイアで指定するか、後述するMTJPHolidayDefaultTagタグで指定します。
2-3.MTJPHolidayDefaultTagタグ
MTIfJPHoliday/MTJPHolidayNameタグのtagモディファイアの規定値を指定するブロックタグです。
例えば、以下のように書くと、MTJPHolidayDefaultTagタグのブロック内では、MTIfJPHoliday/MTJPHolidayNameタグでtagモディファイアを省略しても、「tag="CalendarDate"」のモディファイアを指定したのと同じ動作になります。
<mt:JPHolidayDefaultTag tag="CalendarDate"> ・ ・ ・ </mt:JPHolidayDefaultTag>
3.事例
以下のようにしてカレンダーを出力する例です。
- 個々の日付のtd要素には、祝日なら「holiday」、日曜日なら「sunday」、土曜日なら「saturday」のclass属性を付けます。
- 個々の日付のtd要素のtitle属性に、日付を出力します。ただし、祝日の場合は、日付の後に祝日名も付けます。
<mt:JPHolidayDefaultTag tag="CalendarDate"> <mt:Calendar> <mt:CalendarWeekHeader><tr></mt:CalendarWeekHeader> <mt:CalendarIfBlank> <td> </td> <mt:Else> <mt:IfJPHoliday> <mt:SetVarBlock name="class"> class="holiday"</mt:SetVarBlock> <mt:SetVarBlock name="title"><$mt:CalendarDate format="%Y年%m月%d日"$>(<$mt:JPHolidayName$>)</mt:SetVarBlock> <mt:Else> <mt:SetVarBlock name="title"><$mt:CalendarDate format="%Y年%m月%d日"$></mt:SetVarBlock> <mt:If tag="CalendarDate" format="%w" eq="0"> <mt:SetVarblock name="class"> class="sunday"</mt:SetVarBlock> <mt:ElseIf tag="CalendarDate" format="%w" eq="6"> <mt:SetVarBlock name="class"> class="saturday"</mt:SetVarBlock> <mt:Else> <$mt:SetVar name="class" value=""$> </mt:If> </mt:IfJPHoliday> <td title="<$mt:GetVar name="title"$>"<$mt:GetVar name="class"$>> <mt:CalendarIfEntries> <a href="<mt:Entries lastn="1"><$mt:EntryPermalink$></mt:Entries>"><$mt:CalendarDay$></a> </mt:CalendarIfEntries> <mt:CalendarIfNoEntries> <$mt:CalendarDay$> </mt:CalendarIfNoEntries> </td> </mt:CalendarIfBlank> <mt:CalendarWeekFooter></tr></mt:CalendarWeekFooter> </mt:Calendar> </mt:JPHolidayDefaultTag>
テンプレートの内容は以下の通りです。
1/31行目
カレンダーの個々の日付(MTCalendarDateタグ)を扱うので、MTIfJPHoliday/MTJPHolidayNameのタグモディファイアの規定値を「CalendarDate」にします。
2/30行目
カレンダーを出力します。
3行目
各行の先頭の<tr>タグを出力します。
4~5行目
1日の前/月末の日の後の空白のセルの場合は、スペースのみのtd要素を出力します。
7~9行目
出力する日が祝日なら、変数classに「class="holiday"」を代入します。
また、変数titleに、日付と祝日名を代入します。
11行目
出力する日が祝日でないなら、変数titleに日付を代入します。
12~13行目
出力する日が日曜日なら、変数classに「class="sunday"」を代入します。
14~15行目
出力する日が土曜日なら、変数classに「class="saturday"」を代入します。
16~17行目
出力する日が平日なら、変数classの値を空文字列にします。
20行目
<td>タグを出力します(title/class属性を含む)。
21~23行目
ブログ記事がある日なら、日を出力し、かつその日の最新の記事にリンクします。
24~26行目
ブログ記事がない日なら、日だけを出力します。
29行目
各行の最後の</tr>タグを出力します。