「WordPressで学ぶPHP(1)変数・制御構造編」が発売されました。
「WordPressで学ぶPHP」シリーズの第1巻で、WordPressを通してPHPを学んでいく本です。
この本では、PHPの基本となる変数と制御構造について解説します。
Kindle本で、定価500円です。
複数ブログの同一名カテゴリに属する記事をまとめて出力する
mixiのMovable Typeのコミュニティで、「複数ブログの同一名カテゴリに属する記事をまとめて出力するには?」といった内容の質問が出ていました。
面白そうだったので、方法を考えてみました。
1.質問の概要
質問の概要は、以下の通りです。
- 「おすすめレストラン」と「おすすめカフェ」の2つのブログがある
- それぞれのブログに、「東北」「関東」などの地域毎のカテゴリがある
- 2つのブログの記事を、同じカテゴリ名毎にまとめて、「おすすめショップ」のような形で出力したい
最終的には、以下のような出力を得たいということです。
- 「東北」カテゴリ
- 東北カテゴリのお勧めショップを出力(おすすめレストランとおすすめカフェの一覧を混在して出力)
- 「関東」カテゴリ
- 関東カテゴリのお勧めショップを出力(おすすめレストランとおすすめカフェの一覧を混在して出力)
- その他のカテゴリも同様に出力
2.MTEntriesタグでinclude_blogsモディファイアとcategoryモディファイアを組み合わせる
MTEntriesタグにinclude_blogsモディファイアを指定すると、複数のブログの記事をまとめて出力することができます。
また、MTEntriesタグにcategoryモディファイアを指定すると、特定のカテゴリのブログ記事だけを出力することができます。
こちらで試してみたところ、これら2つのモディファイアを組み合わせると、複数のブログから、同名のカテゴリに属するブログ記事をまとめて出力することができました。
例えば、IDが2番と3番のブログのそれぞれに、「東北」というカテゴリがあるとします。
この場合、これら2つのブログの「東北」カテゴリに属するブログ記事をまとめて出力したい場合だと、以下のように書くことができます。
<mt:Entries include_blogs="2,3" category="東北"> ブログ記事の情報を出力する部分 </mt:Entries>
ただし、複数のブログで、カテゴリの階層構造が同じになっている必要があるようです。
それぞれのブログに同じ名前のカテゴリがあっても、ブログごとに階層が異なると、うまく出力することができませんでした。
3.MTTopLevelCategoriesタグと組み合わせる
ブログ内のそれぞれのカテゴリ毎に、上記の2の手順でブログ記事の一覧を出力するには、以下のようにします。
- MTEntriesタグのブロックをMTTopLevelCategoriesタグのブロックで囲みます。
- MTTopLevelCategoriesタグのブロックの先頭で、個々のカテゴリ名を変数に代入します。
- MTEntriesタグのcategoryモディファイアに、上で代入した変数を指定します。
具体的には、テンプレートを以下のように組みます。
<mt:TopLevelCategories> <$mt:CategoryLabel setvar="cat_label"$> カテゴリの情報を出力する部分 <mt:Entries include_blogs="ブログのIDのリスト" category="$cat_label"> 個々のブログ記事の情報を出力する部分 </mt:Entries> <$mt:SubCatsRecurse$> </mt:TopLevelCategories>
2行目のタグで、カテゴリ名を変数cat_labelに代入します。
そして、4行目のMTEntiresタグで、categoryモディファイアに変数cat_labelの値を指定して、そのカテゴリのブログ記事を読み込みます。
なお、テンプレートを入れるブログと、出力するカテゴリ/記事を含むブログが異なる場合は、上記の部分をMTBlogsタグのブロックで囲み、include_blogsモディファイアを入れて、出力するブログのうちのどれか1つのIDを指定します。
例えば、IDが2番と3番のブログの記事を出力したいとします。
また、テンプレートは上記の2つのブログとは異なるブログに入れるとします。
この場合、テンプレートを以下のように組みます。
<mt:Blogs include_blogs="2"> <mt:TopLevelCategories> <$mt:CategoryLabel setvar="cat_label"$> カテゴリの情報を出力する部分 <mt:Entries include_blogs="2,3" category="$cat_label"> 個々のブログ記事の情報を出力する部分 </mt:Entries> <$mt:SubCatsRecurse$> </mt:TopLevelCategories> </mt:Blogs>
ちなみに、Movable Type 5だと、ウェブサイトを複数ブログのポータルとして使って、各ブログの情報をウェブサイトでまとめて出力する機会がよくあります。
その場合、上のような部分をウェブサイトのテンプレートに入れれば、各ブログの同一カテゴリ名のブログ記事をまとめて、ウェブサイトのポータル的なページに出力することができます。