拙著「WordPress Web開発逆引きレシピ」が発売されました。
WordPressの様々なカスタマイズについて、逆引きの形式で取り上げています。
PHP 7.0での動作確認も行っています。
複数ブログで同一とみなすカテゴリに属する記事をまとめて出力する
以前に、「複数ブログの同一名カテゴリに属する記事をまとめて出力する」というカスタマイズ方法を紹介しました。
この関連で、「複数ブログで、同一とみなすカテゴリ(構造的には同じでも名前が異なるカテゴリ)に属する記事をまとめて出力したい」といった内容の質問が、MTQに上がっていました。
この質問にお答えします。
1.質問の内容
ご質問の内容は、以下のようなものです。
- ブログ東京とブログ横浜の2つのブログがある
- それぞれのカテゴリ構造が以下のようになっている(ブログ東京の「カフェTC」と、ブログ横浜の「カフェYC」は、名前が違うが、階層的に同じとみなすカテゴリ)
ブログ東京(blog ID:5) ブログ横浜(blog ID:7) ├親 カテゴリ:飲食店
│ ├ 子カテゴリ:カフェTC
│ │ └ 記事TC1, TC2, TC3 ...TCD1
│ └ 子カテゴリ:レストラン
├親 カテゴリ:ショッピング
│ ├ 子カテゴリ:デパート
│ │ └ 記事TD1, TD2, TD3 ...TCD1
└子カテゴリ:路面店├親 カテゴリ:飲食店
│ ├ 子カテゴリ:カフェYC
│ │ └ 記事YC1, YC2, YC3 ...YCD1
│ └ 子カテゴリ:レストラン
├親 カテゴリ:ショッピング
│ ├ 子カテゴリ:デパート
│ │ └ 記事YD1, YD2, YD3 ...YCD1
└子カテゴリ:路面店 - 同名のカテゴリか、同一とみなすカテゴリで、ブログ記事をまとめて出力したい
2.考え方
複数のブログにまたがって、同一名のカテゴリのブログ記事を読み込むには、以下のようにすれば良いです(以前の記事も参照)。
<mt:Entries include_blogs="ブログAのID,ブログBのID,・・・" category="カテゴリ名"> ブログ記事の情報を出力する部分 </mt:Entries>
一方、今取り上げている例では、「『ブログAのカテゴリX』または『ブログBのカテゴリY』」のように、ブログ/カテゴリの条件をORで結んで読み込む必要があります。
この場合、カテゴリXはブログAだけにあり、またカテゴリYがブログBだけにあるという条件を満たすなら、以下のようにすることで出力することができます。
<mt:Entries include_blogs="ブログAのID,ブログBのID" category="カテゴリX OR カテゴリY"> ブログ記事の情報を出力する部分 </mt:Entries>
3.事例
ここまでの話に基づいて、ご質問の例をテンプレートにすると、以下のようになります。
<mt:TopLevelCategories> <$mt:CategoryLabel setvar="cat_label"$> <mt:If name="cat_label" eq="カフェTC"> <$mt:SetVar name="cat_label" value="カフェTC OR カフェYC"$> </mt:If> カテゴリの情報を出力する部分 <mt:Entries include_blogs="5,7" category="$cat_label"> 個々のブログ記事の情報を出力する部分 </mt:Entries> <$mt:SubCatsRecurse$> </mt:TopLevelCategories>
このテンプレートの内容は以下の通りです。
1/11行目
MTTopLevelCategoriesタグでカテゴリを順に読み込みます。
2行目
カテゴリ名(MTCategoryLabelタグ)を、変数cat_labelに代入します。
3~5行目
変数cat_labelの値が「カフェTC」の時には、値を「カフェTC OR カフェYC」に変えます。
7~9行目
IDが5番と7番のブログから、カテゴリ名が変数cat_labelのカテゴリに属するブログ記事を読み込み、出力します。
4.注意点
2.であげたテンプレートは、「ブログAまたはブログB」かつ「カテゴリXまたはカテゴリY」のブログ記事を読み込むことを表します。
そのため、ブログAにカテゴリYが存在すると、そのカテゴリの記事も読み込まれてしまいます。
同様に、ブログBにカテゴリXがあれば、そのカテゴリの記事も読み込まれます。
したがって、「「『ブログAのカテゴリX』または『ブログBのカテゴリY』」とは違う動作になります。
ブログAにカテゴリYが存在する(またはブログBにカテゴリXが存在する)場合は、「ブログAのカテゴリX」の記事と、「ブログBのカテゴリY」の記事を別々に読み込んで、ハッシュで並べ替えるなどの策を取る必要があります。