ワードプレスをマルチサイト化して簡単に子ブログをカテゴリーに分ける方法

6 12月

この記事の所要時間: 57

ワードプレスでマルチサイトを作るときには、
親サイトがポータルサイトになり、
子ブログの記事を一覧にして表示することが多いと思います。
それぞれの子ブログは別々のユーザーが更新することになり、
その子ブログをカテゴリー毎に分けて最新情報などを一覧にしたいと思います。
一覧にする子ブログのblog_idを指定しておけば、
指定された子ブログの記事を呼び出すことができますが、
子ブログが増えるたびにポータルサイトのテーマを修正して
blog_idを指定するのはかなり大変だと思います。

この時に便利なプラグインが「WordPressのマルチサイト機能を使う場合に便利なプラグインを配布してみる。 » とりあえず9JP」で配布されています。
このプラグインを使うとブログのoptionsテーブルに好きな項目を追加したり削除したり簡単にできるので、
新しく子ブログを追加したときに子ブログのオプションにカテゴリーを入力しておきます。
ポータルサイトの親サイトの方ではそのカテゴリーのブログの最新情報一覧を表示するときに
テーマ内に以下を記入しておきます。

< ?php
$sql = <<< HERE
		SELECT blog_id FROM $wpdb->blogs
		WHERE site_id = $wpdb->siteid
		AND spam = 0
		AND deleted = 0
HERE;
		$blogs = $wpdb->get_results($sql);
		$count = count($blogs);
?>

マルチサイト内のブログが何件あるか調べて、
各ブログのblog_idを取得します。

< ?php
$sql = '';
		for ($i = 0; $i < $count; $i++){
			$blog = $blogs[$i];
			if($blog->blog_id != 1){
			switch_to_blog($blog->blog_id);
			$sql .= < << HERE
		(SELECT *, $blog->blog_id as blog_id
		FROM $wpdb->options
HERE;
		if(is_page('cafe')){
			$sql .="
					WHERE option_value = 'cafe'
					AND option_name = 'mytheme_options6')";
		}else if(is_page('bar')){
			$sql .="
					WHERE option_value = 'bar'
					AND option_name = 'mytheme_options6')";
		}

		if ($i != $count - 1){
				$sql .= "UNION\n";
			}
			restore_current_blog();
			}
		}

		$blogs = $wpdb->get_results($sql);
		?>

各ブログのoptionsテーブルからブログカテゴリーにあったブログのblog_idだけを取得します。
この例では、cafeページの時、ブログカテゴリーがcafeのブログを
barページの時はブログカテゴリーがbarのブログを選んでいます。
option_valueがサイトオプションで入力したブログカテゴリーになります。
option_nameはサイトオプションでブログカテゴリーのkeyになっているものです。

< ?php
$sql = '';
		$count = count($blogs);
		for ($i = 0; $i < $count; $i++){
			$blog = $blogs[$i];
			if($blog->blog_id != 1){
			switch_to_blog($blog->blog_id);
			$sql .= < << HERE
		(SELECT *, $blog->blog_id as blog_id
		FROM $wpdb->posts
		WHERE post_type = 'post'
		AND post_status = 'publish'
		ORDER BY post_date DESC
		LIMIT 10)

HERE;
			if ($i != $count - 1){
				$sql .= "UNION\n";
			}
			restore_current_blog();
			}
		}
		$sql .= < << HERE
		ORDER BY post_date DESC
		LIMIT 10
HERE;
		$posts = $wpdb->get_results($sql);
?>

最後にカテゴリーで絞込みがされたblog_idの記事を取得します。
post_typeを変更すればカスタム投稿の記事だけを取得することも出来ます。

< ?php
foreach ($posts as $post) :
				switch_to_blog($post->blog_id);
				setup_postdata($post);

				// ここに通常の時と同じ様にループ内の処理を記入

				restore_current_blog();
endforeach;
?>

一覧表示の処理を記入して出来上がりです。
sqlに詳しい方なら、もっと効率よくデータを取り出せると思います。
もしsqlの部分を簡単にできる場合は教えてください。
よろしくお願いします。
各子ブログをカテゴリーごとに違うテーマを割り当てている場合は、
テーマ内のfunctions.phpにブログのoptionsテーブルに
カテゴリーを追加するコードを書いておくと更に簡単かもしれないですね。

マルチサイト化されている場合は、一覧表示するパターンが多いので
子ブログにカテゴリーやタグをつけておくと便利です。

Comments are closed.