「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」の続編にあたり、PHPの「データ構造」(配列とオブジェクト)について解説します。
配列やオブジェクトは、頭の中で考えるだけでは、イメージがつかみにくいです。本書では図を多用して、配列やオブジェクトをなるべく分かりやすく解説することを心がけました。
Kindle本で、定価250円です。
記事と同一カテゴリ・同一年度の記事一覧を出力する
MTQに、「記事のページに、その記事と同一カテゴリ・同一年度の記事一覧を出力したい」と思われる質問がありました。
この質問に答えます。
1.プラグインのインストール
カテゴリ/年度別アーカイブを出力するために、拙作のExtendArchivesプラグインが必要です。
インストール手順はこちらのページをご参照ください。
2.考え方
以前に、「特定カテゴリの今年度のブログ記事一覧を出力する」という記事を書きました。
ベースの考え方は、そこで書いた通りです。
ただ、「特定カテゴリの今年度のブログ記事一覧を出力」の場合とは、以下の点が異なります。
項目 | 特定カテゴリの 今年度の記事一覧 | 記事と同一カテゴリ・同一年度の 記事一覧 |
---|---|---|
対象のカテゴリ | 特定のカテゴリを指定 | 記事のカテゴリを利用 |
対象の年度 | 現在の日付が属する年度 | 記事の日付が属する年度 |
記事のカテゴリの情報は、主カテゴリだけで良ければ、MTEntryPrimaryCategoryタグから得ることができます。
また、副カテゴリも必要な場合は、MTEntryAdditionalCategoriesタグや、MTEntryCategoriesタグを使います。
また、記事が属する年度は、記事の日付を元に計算して求めます。
例えば、年度の始まりが4月の場合だとします。この場合、2014年1月から3月までの記事は、2013年度に属します。
一方、2014年4月から2014年12月までの記事は、2014年度に属します。
記事の年度が分かったら、MTArchiveListタグを使って、アーカイブの年度と記事の年度が等しいときだけ記事の一覧を出力するようにします。
3.テンプレートの組み方
ここまでの話を元にして、記事と同一カテゴリ(主カテゴリのみ)・同一年度の記事一覧を出力するテンプレートを組むと、以下のようになります。
なお、年度の最初の月が4月であるものとしています。
最初の月が4月でない場合は、3行目の「lt="4"」のところの「4」を書き換えてください。
<$mt:EntryDate format="%Y" setvar="entry_year"$> <$mt:EntryDate format="%m" setvar="entry_month"$> <mt:If name="entry_month" lt="4"> <$mt:SetVar name="entry_year" op="--"$> </mt:If> <mt:EntryPrimaryCategory> <mt:ArchiveList archive_type="Category-FiscalYearly"> <mt:If tag="ArchiveDate" format="%Y" eq="$entry_year"> アーカイブの情報を出力する部分 <mt:Entries> 個々のブログ記事の情報を出力する部分 </mt:Entries> </mt:If> </mt:ArchiveList> </mt:EntryPrimaryCategory>
テンプレートの内容は以下の通りです。
3-1.1~2行目
記事の日付から年と月を取り出し、それぞれを変数entry_year/entry_monthに代入します。
3-2.3~5行目
記事の月が4月より小さい場合、前の年度に属しますので、記事の年(変数entry_year)から1を引きます。
3-3.4/13行目
記事の主カテゴリを取り出して処理を行います。
3-4.5/12行目
カテゴリ年度別アーカイブリストを出力します。
4行目のMTEntryPrimaryCategoryタグによって、記事の主カテゴリだけのカテゴリ年度別アーカイブリストになります。
3-5.6/11行目
アーカイブの日付(MTArchiveDateタグ)から年度を取り出し、それを記事の年度(変数entry_year)と比較して、両者が一致する(=記事の年度とアーカイブの年度が同じ)ときだけ、MTIfタグのブロック内を出力します。
3-6.8~10行目
アーカイブ内の記事の一覧を出力します。
ここまでの処理によって、記事と同じカテゴリ/年度の記事一覧だけが出力されます。