コラム

2009年03月06日
WordPressで複数ブログ『風』にする方法

WordPressでは基本的に複数ブログは作成できません。
WordPress MUという別バージョンがあり、こちらでは複数ブログはできるのですが、これはどちらかというとホスティング向けで、完全に別の人が使い、IDなども別々にするような形を想定されています。

しかし、

・ユーザーIDはわけたくない。
・一つのサイトの中にブログが複数ある形にしたい
(例えば、「担当者ブログ」と「社長ブログ」とか)

という要件がよくあります。
これはいつも頭を悩まされるところです。

古いWordPressのバージョンでは、Multiplyというプラグインがあり、これで実現できたようなのですが、最新版(現在2.7)に対応しているものはありません。

ブログによりテーブルのプリフィックスを変えて複数運用する、という方法も編み出されていますが、別WordPress扱いになり、ユーザー情報などを共有できないため、それぞれ別にログインする必要があり、これも、要件的には満たせそうにありません。
(WordPress MUをWordPressでやってしまおうというようなイメージですね。こちらの方が本当の意味での複数ブログ、という感じはしますが)

<参考>
WordPressによる複数blog運用。(10行追加+α) マツボックリンゴ
1つのwordpressファイルで複数ブログ これどうやるの?

今回は、1ユーザーで1サイト内に複数のブログをあるように見せたいということなので、テーマファイルを変更して、カテゴリによって表示を切り替える、という方法で対応することにしました。
なんとなく簡単そうに思えますが、これが結構大変です。

例えば、

●社長ブログ
   ・新着情報
   ・日々の出来事
   ・経営について

●担当者ブログ
   ・新着情報
   ・日々の出来事
   ・新商品開発

というような構成になっていたとします。

社長ブログ、担当者ブログ、それぞれデザインを分けて、独立したブログ風に見せたいとします。
(必要なコンテンツは、月別アーカイブ、カテゴリ一覧です。)

まず、WordPressでは、カテゴリを指定しての月別アーカイブ一覧というのが表示できません。
wp_get_archivesというテンプレートタグが用意されていますが、こちらはカテゴリを指定できません。
ですから、wp_get_archivesを改造して、カテゴリを指定できるようにする必要があります。
具体的には、引数としてカテゴリを渡すようにし、archive.phpで処理をする際、そのカテゴリの記事のみを取得する、という方法です。

また、それぞれのブログの中の子カテゴリは、増えていく可能性があります。
となると、カテゴリIDを決め打ちでデザインを分ける、ということもできません。
ですから、ここは親カテゴリのIDを取得して、それで判定させる、という方法が必要です。
(親カテゴリは変更しないものと想定)

最終的にはこのようになりました。

・まず、親カテゴリIDを取得し、『社長ブログ』か『担当者ブログ』かを判断する
・wp_get_archivesを改造してカテゴリを指定できるようにしたものに、その親カテゴリIDを渡し、月別アーカイブ一覧を出す。(その際、子カテゴリの記事全てを対象とするように改造する)
・通常、月別アーカイブは、カテゴリを指定できるようになっていないので、引数としてカテゴリIDを渡すようにする。 http://○○/2009/02?c=1  というような形。
・archive.phpで、その引数を取得して、そのカテゴリ内の記事のみを一覧で表示させるようにする。

ちょっと泥臭い感じもしますが、これで実現できました。

詳しいソースは載せませんが、悩まれている方が多いと思うので、考え方として参考になれば、と思います。

<参考>
●親カテゴリの取得の仕方
http://ja.forums.wordpress.org/topic/507

$cat = get_category($id);
$parent_cat = $cat->parent;
という形で取得できます。

●子カテゴリを全て取得する方法
get_category_children関数を使います。
$cat_child = get_category_children($cat->parent)
というような形。

●元々ある関数を改造する場合
例えば、wp_get_archivesを改造する場合は、テーマフォルダ内にfunction.phpを作成し、その中にwp_get_archivesを複製します。
そして、関数名をwp_get_archives2とかに変更して、それを呼び出すようにします。

●query_postsで条件を指定する場合
$query_stringの後ろに付け足してやるといいです。
例えば、次のような感じ。

    $query_posts_hikisu = $query_string . ‘&cat=’ . $cat->cat_ID;
    query_posts($query_posts_hikisu);

これで、元々の出力条件にカテゴリの条件を付け足すことができます。