Wordpressによる複数blog運用。(10行追加+α)
こんな人向け
- 1つのWordpressで複数のblogを運用したい。
- ここに複数運用するための手順がいろいろ紹介されているけど、どれもめんどくさい。
- Wordpress-MUは、Wordpress用のプラグインが使えなくなるので、使いたくない。
- 日本のblogで紹介されている手法は、blogごとにWordpressの管理ディレクトリが作成されてしまって気持ち悪い。
- .htaccessを設置できる or サーバ上でシンボリックリンクを張れる。
私がとったアプローチは、アクセスされてきたpathに応じてテーブル名を動的に決定する手法。 公式サイトに紹介されている内容は大がかりにコードを修正したりパッチを適用したりしています。
この方法なら数行の変更と1つの小さな設定で新たなblogを構築できます。
0.概要
Wordpressはblogの記事や設定値をデータベースに入れて保存しています。HTTPでアクセスしてきた時に、指定されたURLのpathによってWordpressが参照するテーブル(データベース)の場所を動的に変えることにより1つのWordpress設置で、複数のWordpressのblogを構築できます。
1.設定
アクセスされたURLのpathとテーブル名の関連付けを行います。
編集するファイルは、Wordpress管理ディレクトリのトップにあるwp-config.phpです。
下の例は、
http://www.tymy.net/~matsu/blog/
をメインとして運用して、
http://www.tymy.net/~matsu/milklog/
をサブとして運用する場合の例です。
/~matsu/blog/でアクセスされた場合は、テーブルのプレフィックス(先頭語)にデフォルトである”wp_”を利用します。
/~matsu/milkblog/でアクセスされた場合はプレフィックスに”wp_milklog_”を利用します。
$prefix_arrayは連想配列です。キーにURIを定義し、値に利用するテーブルのprefix($table_prefixに代入する値)を定義します。以下にdiffを載せておきます。
% rcsdiff -r1.1 -r1.3 wp-config.php
===================================================================
RCS file: RCS/wp-config.php,v
retrieving revision 1.1
retrieving revision 1.3
diff -r1.1 -r1.3
17a18,31
> // determine table prefix according to the REQUEST_URI
> $prefix_array = array(
> '/~matsu/milklog' => 'wp_milklog_'
> );
>
> if($prefix_array){
> $uri = $_SERVER['REQUEST_URI'];
> foreach($prefix_array as $search_uri => $search_table_prefix){
> if(strpos($uri, $search_uri) === false){ continue; }
> $table_prefix = $search_table_prefix;
> }
> }
>
>
次に、指定されたpathでアクセスできるように設定します。
2種類の設定方法があるのでどちらかを選択してください。SSHでログインできない場合は.htaccessによる設定を選んでください。
2.1 シンボリックリンク
指定したpathでアクセスしたときに、Wordpressのファイルを参照するようにシンボリックリンクを張ります。
1つめの引数にWordpressの実態、2つめの引数に新たに追加するblogのpathを指定します。
# wordpressが設置されているディレクトリの上で。 % ln -s blog milk_log
2.2 .htaccess
新たなpathでアクセスされたときにWordpressの実体へアクセスするようにする.htaccessです。
以下に例を載せておきます。
RewriteEngine on
RewriteBase /~matsu/
# rewrite milk blog
RewriteRule milklog/(.*) /~matsu/blog/$1
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule milklog/(.*) /~matsu/blog/index.php [L]
# /end of rewrite milk blog
アイディア元はこちら。
http://ameblo.jp/curiouseverything/entry-10167447535.html
3.新しいblogの設定
新しいblogのwordpress管理画面へアクセスするとblogの初期設定を行う画面が表示されます。
例:
http://www.tymy.net/~matsu/milklog/wp-admin/
4.注意
Wordpressによって保存されたファイル、例えばSitemapのXMLファイルなどはデータベースではなくファイルに保存されます。よって、sitemapのファイル名は各blogで別にしなければなりません。
(sitemapやrobots.txtはWebサーバ側でrewriteまたはaliasmatchしてあげるのがいいです)
Wordpress 2.5, 2.6, 2.7,2.8でも問題なく利用できています。























yuki said
am 3月 6 2008 @ 22:11:06
こんにちは、はじめまして。
Wordpressで一つの管理画面で複数blogを運用したくて、
情報を探していてたどりつきました。
初心者のため、まつぼっくりさんの方法を試してみたのですが、
うまくいきません。もう少し詳しく教えてもらえませんか?
wordpressは二つインストールする必要があるんですか?
とても初歩的な事をきいているとは思うのですが、とても困っていて
お返事をいただきたいです。宜しくお願いします。
matsu said
am 3月 7 2008 @ 4:25:34
yukiさん
はじめまして。
コメント書いてくださってありがとうございます。
wordpressは2つインストールする必要はありません。この点が、この記事で書いた方法の利点です。
記事の最初の方にある「こんな人向け」の各項目を理解できるレベルが前提なのですが、こちらの方はクリアですか?
yuki said
am 3月 7 2008 @ 11:31:13
matsuさん
お返事ありがとうございます。
はい、シンボリックリンクという言葉は初めて知りましたが、そのほかは理解できます。
ご説明いただくにどの程度までWordPressの事を私が知っているか必要なんだと思いますが、テンプレートを使わずにページやカテゴリーを作成して10ページ程度のwebサイトを作りました。
ご存じか分かりませんが、毎日コミュニケーションズ出版のWordpressサイト構築スタイルブックの内容が理解できる程度です。
webデザインをメインにしているので、あまりphpの事には詳しくはありません。
matsuさんの方法を理解するにはphpが基本理解できないと難しいですか?
matsu said
am 3月 7 2008 @ 23:03:27
yukiさん。
前提スキルの説明ありがとうございます!
そして、前提となるサーバ環境も重要です。
以下の条件はクリアしてますか?
> サーバ上でシンボリックリンクを張れる。
シンボリックリンクを作れないとこの記事にある手法は使えません。
もし、シンボリックリンクを張れるのであれば、PHPのスキルはさほど必要ありません。
以下の手順で行うのがいいと思います。
1.Wordpressをセットアップ。blogも作る。
2.別のblog用のシンボリックリンク作成
3.wp-config.phpをこの記事に従って編集。
buckeye said
am 5月 15 2008 @ 12:38:39
エントリーをお書きになってからだいぶ時間が経っていますが、質問させて下さい。
この方法で複数のblogを運用した場合、WordPressの設定は複数出来るのでしょうか。例えば、ブログタイトル・キャッチフレーズなどです。”ネザーランドドワーフのみるくです!”も拝見したところ、設定できているようでしたので。
よろしくお願いします。
matsu said
am 5月 15 2008 @ 13:38:45
buckeyeさんコメントありがとうございます。
この方法の場合、複数できますよ。
wordpressは設定をデータベースのテーブルへ保存しています。この方法はblogごとに違うテーブルを利用するため、blogごとに独立した設定を行えます。
buckeye said
am 5月 16 2008 @ 9:53:32
matsuさん早速お返事頂きありがとうございます。
なるほど、設定もデータベースに保存されるんですね。MySQLの中身をちょっと覗いてみて感動しました。
先に確認しておくべきでした。
実際にこの方法を採用しようと思ったのですが、何がわかっていないのかはっきりしました…シンボリックリンクはどこからどこへ張ればいいのですか?
このエントリーの内容だと、こんな感じですか?
ln -s blog milklog
matsu said
am 5月 16 2008 @ 13:45:15
シンボリックリンクは提示していただいた内容でOKです!
フォーマットはこんな感じです。
snt-f said
am 6月 23 2008 @ 11:39:55
matsu様、はじめまして。
上記の情報ありがとうございます。
ただ、ちょっとつまずいていまして、ご教示いただきたく存じます。
wp-config.phpに追記して、シンボリックリンクは張れたのですが、WordPressにアクセスすると、新規のユーザー扱いになってしまいます。
ユーザーはあらかじめ作っておくモノなのでしょうか。。
やりたいこととしては、MTのホスティングライセンスのようなイメージです。ただ、投稿するのは特定のユーザーのみですので、ユーザー登録などは裏側で追加する運用で問題ありません。
よろしくお願いします。
matsu said
am 6月 23 2008 @ 13:31:48
snt-fさん。
Wordpressではユーザ情報はデータベースへ格納されます。この記事の方法を実践すると、データベースは各blogごとに作成されます。
ホスティングサービスとして運用するならば、blogの定義を追加するとともに、ユーザアカウントを追加する必要がありますね。
がんばってっください
snt-f said
am 6月 23 2008 @ 21:08:32
matsu様
返信ありがとうございます。
ただ、ちょっとわからないのですが、
> blogの定義を追加するとともに、ユーザアカウントを追加する必要がありますね。
上記のそれぞれのやり方がわからないのですが、ご教示いただけませんでしょうか。
ユーザーアカウントは、普通にwp-adminで作成するものなのでしょうか。また、そのユーザーのブログの定義はwp-config.phpで 設定したシンボリックリンクのディレクトリ名を
/wp-admin/options-general.php
のWordPress のアドレス(URL)で指定すると言うことなのでしょうか?いちおう試してみたのですが、どうもうまく動きません。。
何度もお手数ですが、ご教示いただければ幸いです。
matsu said
am 6月 24 2008 @ 18:46:52
ユーザアカウント作成の前に、blogの初期化をしなければいけません。
blogのセットアップの1つめの作業はblogの初期化です。その際に管理者カウントの作成を行い、それを用いてログインします。
管理者のユーザ情報は各blogごとに独立して管理されます。
例えば、
blogの定義に以下を追加し、シンボリックリンクを張ります。
$prefix_array = array(
‘/~matsu/milklog’ => ‘wp_milklog_’
, ‘/~matsu/test’ => ‘wp_test_’
);
その後、以下のURLへアクセスすると
http://www.tymy.net/~matsu/test/
以下のURLへリダイレクトされます。
http://www.tymy.net/~matsu/test/wp-admin/install.php
このURLから初期化を行います。
よろず屋 said
am 11月 20 2008 @ 18:01:05
コメントありがとうございました。
私の方はまだまだワードプレス初級者ですが、いろいろ情報共有していきましょう (^-^)/
ユメ said
am 2月 20 2009 @ 15:56:49
はじめまして。
以前wordpressを使っていましたが、当時は重くて、Geeklog に移動したものです。
matsuさんの方法(シンボリックリンクはよく分かりませんので、htaccess)ですと、wordpressを3つ以上のブログを作成することもできるのでしょうか?
matsu said
am 2月 20 2009 @ 16:39:44
ユメさん。
コメントありがとうございます。
.htaccessを使って3つ以上のblogを構築できますよ~!Wordpress本体は、今も重いですね。
キャッシュプラグインなどを利用すれば軽くなりますが、弊害も出ますねぇ。このblogはキャッシュ使っていません。プラグインは15個ぐらい入れてます。すごい重いです。。。
ユメ said
am 2月 20 2009 @ 19:15:45
matsuさん
ありがとうございます
複数ブログは魅力ですが、今も重いのですか・・・
でも、このサイトは閲覧させていただく限りは、そんなに重いとは感じませんでしたが、残念です・・・
matsu said
am 2月 20 2009 @ 22:16:17
ユメ さん
このblogは、
・APCというPHPのextension
・apacheにmod_deflateモジュールをつけてコンパイルし、コンテンツをgzip圧縮
・MySQLのkey_bufferもある程度増やしてあります。
・WP-Cacheは使っていません
・CPUはIntel(R) Pentium(R) 4 CPU 2.80GHz x2
localhostで、ベンチマークしてみました。
2スレッド、100リクエストでトップページを試してみた結果、
19.17 [#/sec] でした。
たしかに、遅くないですね。
私のFirefoxが描画するのに時間がかかってるみたいですね。
toma_max said
am 2月 25 2009 @ 22:32:16
matsu様
はじめまして。
ひとつ質問がありまして、書き込みさせていただきました。
上記の手順で行ったのですが、最後に新しいblogのwordpress管理画面へアクセスすると、「すでにインストールされています。テーブルを削除してください」というコメントが表示されます。おそらくconfig.phpの追加の記述がきちんとできていないと思うのです。
ここで質問です。
わたしはディレクトリ名だけ入れ替えて、下記のような記述を追加したのですが、もし間違えていれば教えてください。
// determine table prefix according to the REQUEST_URI
$prefix_array = array(
‘/~matsu/milklog’ => ‘wp_milklog_’
);
if($prefix_array){
$uri = $_SERVER['REQUEST_URI'];
foreach($prefix_array as $search_uri => $search_table_prefix){
if(strpos($uri, $search_uri) === false){ continue; }
$table_prefix = $search_table_prefix;
}
}
不勉強で恥ずかしいのですが、phpの知識がほとんどないもので。
すみませんが、よろしくお願いします。
matsu said
am 2月 25 2009 @ 23:53:47
問題はご察しの通りだと思います。
この記事のやりかたは、blogのpathを元にテーブル名を変更しています。
$prefix_arrayの定義をご自分の環境に合わせていただく必要があります。
上記の例で言えば、/~matsu/milklogはアクセスするblogの新しいpath。http://www.example.com/~matsu/milklog の場合の設定です。
デバッグするためには、以下のコードを追加したコードの最後に追加してみてください。自分の想定するテーブル名のプレフィックスになれば正しく設定できています。
print $table_prefix;
exit;
がんばってください。何か不明点あったらまた書き込んでください。
toma_max said
am 2月 26 2009 @ 12:48:57
matsu様
回答ありがとうございました。
ただ$prefix_arrayの定義を自分の環境に合わせたのですが、やはりうまくいきません。
すみませんが、もうひとつ質問です。
今はエディタで開いて、コードを追加して、上書き保存しているのですが、デバッグの仕方から見て、コマンドプロンプトを使って編集するのですか?
matsu said
am 2月 26 2009 @ 14:24:23
うまくいきませんかぁ。
設定したコードをコピペしてもらえますか?
また、元々存在するWordpressのURLと新しく設定したいURLを教えてください。
環境は、ローカルのWindowsでしょうか?
デバッグの仕方は、
1.ファイルの変更
2.ブラウザでリロード
の繰り返しですねぇ。
コマンドプロンプトで実行すると、Apacheから設定される環境変数が設定されないので動作しないです。
toma_max said
am 2月 27 2009 @ 2:00:06
matsu様
丁寧に対応していただき、大変ありがとうございます!!!
元々存在するURL:ドメイン名/wordpress/
新しく設定したいURL:ドメイン名/wordpress/blog
環境は、さくらサーバで実験しています。
設定したコードはこちらです。
まずwp-config.phpから。デバッグしてみると、ちゃんと’wp_blog_’になりました。
// determine table prefix according to the REQUEST_URI
$prefix_array = array(
‘/wordpress/blog’ => ‘wp_blog_’
);
if($prefix_array){
$uri = $_SERVER['REQUEST_URI'];
foreach($prefix_array as $search_uri => $search_table_prefix){
if(strpos($uri, $search_uri) === false){ continue; }
$table_prefix = $search_table_prefix;
}
}
次に、.htaccessのコードです。
RewriteEngine on
RewriteBase /wordpress/
# rewrite wordpress blog
RewriteRule blog/(.*) /wordpress/$1
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule blog/(.*) /wordpress/index.php [L]
# /end of rewrite wordpress blog
なかなか上手くいきません。/wordpress/blogというURLに新しいページを先に作ってから、そのページが第二のブログになるようにmatsu様の紹介されている手順を踏んでいますが、そのやり方が誤っているという可能性はありますか?
ご教授よろしくお願いします。
matsu said
am 3月 2 2009 @ 1:01:47
返信遅くなってすいません。
PHPは問題ないです。.htaccessがうまく動いていないのかも知れません。.htaccessでrewriteが動作しているか検証してみてはどうでしょうか。
以下のコードだけを.htaccessに書いて、yahooにリダイレクトされればrewriteは動作しています。
—————————
RewriteEngine On
RewriteRule .* http://www.yahoo.co.jp/ [L]
—————————
シェルでログインできるプランなら、.htaccess使わないでシンボリックリンクを使う方が確実だと思います。
.htaccessの設定だとどうしても複雑になって、デバッグしづらいので。
http://www.sakura.ne.jp/function/matrix.html#12
toma_max said
am 3月 10 2009 @ 18:25:33
matsu様
ご丁寧に対応していただいて、どうもありがとうございました。
今回は、製作中のサイトは、一旦複数個ワードプレスをインストールしするというところで妥協しました。でもこれからローカルでいろいろ実験していこうと思います。今回matsu様のアドバイスを受けていろいろ試していく中で、たくさん新しい知識の種を得ました。これからがんばって勉強していきます。ありがとうございました。
suzuki said
am 6月 26 2009 @ 21:24:20
こんにちは。はじめまして。suzukiと申します。
そろそろブログを導入してみようかと思い立ち、評判のよいWordPressにWP-SuperCacheを導入するか、Serene Bach(sb)を利用するか(静的生成+mod_gzip(1.xなので:-p)に拘っています)で迷っていまして、結局両方導入してみようと決心し、複数ブログ運用について調べていてこちらに行き着きました。
まだこれから取り掛かるところなのですが、素朴な疑問点があります。
08.> // determine table prefix according to the REQUEST_URI
09.> $prefix_array = array(
10.> ‘/~matsu/milklog’ => ‘wp_milklog_’
11.> );
とありますが、これは連想配列でしょうか。
(私はC言語しかわからないので変なことを言ってましたらすみません。)
これは配列で’/~matsu/’だけを取っておいて、
$table_prefix = “wp_”.substr($uri, strpos($uri,$prefix_array)+strlen($prefix_array), strlen($uri)-(strpos($uri,$prefix_array)+strlen($prefix_array))).”_”;
という感じにするのではいけないのでしょうか。
つまり/~matsu/*へのアクセスに対してはwp_*_のテーブルを参照するように、という形です。
こうすれば、ブログを増やすごとにconfigを弄らなくて済むので(symbolic linkごとディレクトリをcp -Rすればよいだけ(?)なので)イイかなと思ったのですが・・・そうはうまく行かないものでしょうか。
matsu said
am 6月 26 2009 @ 21:43:49
suzukiさん。
おっしゃるとおり$table_prefixは、連想配列です。キーがURLのpath, 値がデータベース名のprefixです。
書かれたコードではだめです。パラメータインジェクションと似たような危険があります。
例えば、以下のようなURLにアクセスされたらWordpressがそのデータベースへ接続詞にしに行こうとしてしまい、MySQLに無駄な負荷がかかります。
/~matsu/test/
/~matsu/asdfasdf/
初期インストールのURLを叩かれたら第三者が新しいWordpressをWebから設置できてしまいます。
/~matsu/test/install/
よって、この記事の本文では、安全性を考えてデフォルトのprefixを定義し、ある特定の文字を含むpathへアクセスすると特定のデータベースへ接続するようにしています。
コード読み違えていたらすいません。
↓以下、細かい回答です。
——————————————–
> ブログを増やすごとにconfigを弄らなくて済むので(symbolic linkごとディレクトリをcp -Rすればよいだけ(?)なので)
blogを開設するごとにwordpressをcp -rによって複製しないための設定です!
——————————————–
> ブログを増やすごとにconfigを弄らなくて済むので
それが理想ですが、安全面を考えるとデータベース名を100%動的に算出するのは危険です。
suzuki said
am 6月 26 2009 @ 22:25:53
matsu様
お返事いただきまして、ありがとうございます。
>例えば、以下のようなURLにアクセスされたらWordpressがそのデータベースへ接続詞にしに行こうとしてしまい、MySQLに無駄な負荷がかかります。
symbolic linkを自動生成しているわけではないので、その問題は起こらないような気がします。
たとえば
/~matsu/test/
は、事前に
ln -s blog test
としていなければ、404エラーになるだけではないでしょうか。
(index.phpにアクセスできなければ、configが読まれることもない)
>blogを開設するごとにwordpressをcp -rによって複製しないための設定です!
すみません、勘違いしていました。
記述にあるsymbolic linkはディレクトリに対するものだったのですね。(てっきりwordpressのコアがblogという名前で、それをユーザごとのディレクトリにそれを入れるものかと想像しておりました。)
>安全面を考えるとデータベース名を100%動的に算出するのは危険です。
安全面については一応考えているつもりではありますが、再考したいと思います。ご助言、ありがとうございます。
matsu said
am 6月 26 2009 @ 22:37:28
> symbolic linkを自動生成しているわけではないので、その問題は起こらないような気がします。
確かにそうですね。apacheレベルではじかれますね。
(全ての/~matsu/以下をrewriteすると思いこんでいました)
blog構築応援してます!
suzuki said
am 6月 26 2009 @ 23:27:21
matsu様
お返事いただきましてありがとうございます。
また応援いただきまして、誠に恐れ入ります。
お気持ちにお応えできますように、頑張ります。
連想配列についてなど、勉強になりました。ありがとうございました。
(mod_rewriteもうちのサーバにはインストールしてありますので、試せたら試したいと思います)
丁寧迅速なご対応、ありがとうございました。
またコメント欄にて長文乱筆、大変失礼いたしました。
それでは、失礼いたします。
suzuki said
am 6月 28 2009 @ 22:08:11
matsu様
先日はありがとうございました。suzukiです。
まだ試行錯誤中ですが、報告にあがりました。
pdo-for-wordpressというプラグインを用いて、sqliteにて運用しようとしたのですが、どうもこのプラグイン、$table_prefixを無視して’wp_’意外は受け付けず、むしろ’wp_’以外を設定したらエラー、データベース名もこちらで決めたものではなく、MyBlogというデータベース名で勝手に作成という、ちょっと困ってしまう仕様になっておりました。
MySQLはMTと同様、ライセンス周りで細かいところがあるので、sqliteで運用することに拘りたいと思っております。
よってmatsu様の方法は使えなくなってしまいました。
悲しいですが、cp -Rで我慢しておこうと思います。
(プロセスが無駄に立ち上がるんだろうなぁ・・・と今から滅入ってしまいますが)
こちらで身に付けさせていただきました知識は大切にします。
ありがとうございました。失礼いたします。