「WordPressで学ぶPHP(1)変数・制御構造編」が発売されました。
「WordPressで学ぶPHP」シリーズの第1巻で、WordPressを通してPHPを学んでいく本です。
この本では、PHPの基本となる変数と制御構造について解説します。
Kindle本で、定価500円です。
今月/来月の記事一覧を出力する(後編)
昨日に続いて、今月/来月の記事一覧を出力する方法を紹介します。
今日は、今月または来月の記事がない場合に、「記事はありません」と出力できるようにする方法を取り上げます。
1.今月/来月の記事をいったん変数に代入する
昨日のテンプレートでは、今月/来月の記事一覧を直接に出力します。
ただし、MTArchiveListタグは、記事がないアーカイブは一切出力しません。
今月(または来月)に記事がない場合、その月については、MTArchiveListタグのブロック内が処理されません。
結果として、今月(または来月)に記事がないと、その部分には何も出力されなくなってしまいます。
そこで、今月/来月の記事を直接に出力せずに、いったんハッシュに代入します。
そして、後でハッシュの内容を確認し、記事があるかどうかを判断してから、出力するようにします。
昨日の記事のMTEntriesタグのブロックをMTSetVarBlockタグで囲み、ハッシュに代入します。
ハッシュのキーとして、「201201」のような年月(変数this_monthやnext_monthの値)を使います。
そして、ハッシュの値として、出力する記事一覧を代入します。
例えば、今月が2012年2月だとします。
この場合、今月と来月の両方に記事があれば、ハッシュの内容は以下のようになります。
キー | 値 |
---|---|
201202 | 2012年2月の記事一覧 |
201203 | 2012年3月の記事一覧 |
一方、2012年2月に記事があって、3月に記事がない場合は、3月についてはMTArchiveタグのブロックが実行されません。
そのため、ハッシュの内容は以下のようになります。
キー | 値 |
---|---|
201202 | 2012年2月の記事一覧 |
このようにしてハッシュを作った後、ハッシュに今月/来月の要素があるかどうかを条件判断します。
要素があれば(=記事一覧が代入されていれば)、その記事一覧を出力します。
一方、要素がなければ、「記事はありません」と出力します。
2.テンプレートを書き換える
ここまでの話に基づいて、昨日紹介したテンプレートを書き換えると、以下のようになります。
<$mt:Date format="%Y%m" setvar="this_month"$> <$mt:GetVar name="this_month" op="++" setvar="next_month"$> <mt:If name="next_month" like="13$"> <$mt:Date format="%Y" setvar="next_year"$> <$mt:GetVar name="next_year" op="++" setvar="next_month"$> <$mt:SetVar name="next_month" append="1" value="01"$> </mt:If> <mt:Blogs include_blogs="2"> <mt:ArchiveList archive_type="Monthly"> <$mt:ArchiveDate format="%Y%m" setvar="archive_month"$> <$mt:SetVar name="flag" value="0"$> <mt:If name="archive_month" eq="$this_month"> <$mt:SetVar name="flag" value="1"$> <mt:Else name="archive_month" eq="$next_month"> <$mt:SetVar name="flag" value="1"$> </mt:If> <mt:If name="flag"> <mt:SetVarBlock name="entries" key="$archive_month"> <h2><$mt:ArchiveDate format="%Y/%m"$></h2> <mt:Entries> <div> <h3><$mt:EntryTitle$></h3> <$mt:EntryBody$> </div> </mt:Entries> </mt:SetVarBlock> </mt:If> </mt:ArchiveList> </mt:Blogs> <mt:If name="entries" key="$next_month"> <$mt:GetVar name="entries" key="$next_month"> <mt:Else> <h2><$mt:Date ts="$next_month" format="%Y/%m"></h2> <div><p>記事はありません。</p></div> </mt:If> <mt:If name="entries" key="$this_month"> <$mt:GetVar name="entries" key="$this_month"> <mt:Else> <h2><$mt:Date ts="$this_month" format="%Y/%m"></h2> <div><p>記事はありません。</p></div> </mt:If>
昨日のリストと比べると、19/27行目のMTSetVarBlockタグと、32行目以降が追加になっています。
19/27行目のMTSetVarBlockタグは、今月および来月の記事一覧を、「entries」という名前のハッシュに代入する働きをします。
ハッシュのキーとして、変数archive_monthの値を指定していますので、キーは「201201」などの年月の値になります。
32~37行目は、来月に記事があるかどうかを判断して、出力を分ける部分です。
32行目のMTIfタグでは、ハッシュentriesの中で、キーが来月の月(変数next_month)になっている要素があるかどうかを判断しています。
要素があれば、33行目によって、その値が出力されます。
ハッシュの値には、19~27行目のMTSetVarBlockタグによって、個々の月のブログ記事一覧が代入されていますので、結果として来月のブログ記事一覧が出力されます。
一方、ハッシュに要素がない場合は、32行目のMTIfタグが成立せず、34行目のMTElseタグ以降によって、「記事はありません」と出力されます。
38~43行目では、32~37行目と同様の考え方で、今月の記事があるかどうかを判断して出力を分けています。
3.変数や条件判断は必須
この例のように、手の込んだ処理をしようとすると、変数や条件判断を避けて通ることができません。
拙著「Movable Type 5.1 Webサイト製作ガイドVolume 2」では、変数や条件判断について、かなり詳しく解説しています。
「変数や条件判断がよく分からない」という方は、ぜひ拙著をお読みください。