WordPressによる複数blog運用。(10行追加+α)
概要
1つのWordpressプログラムで複数のblogを運用したい人向けの記事です。
WordPress3.0以降は、Wordpress自体に複数のブログを構築できるようになっているので、この記事の方法ではなく、Wordpress自体の機能を利用した方がよいかもしれません。
この記事で紹介する方法では、.htaccessを設置できる or サーバ上でシンボリックリンクを張れることが前提です。
この方法なら数行の変更と1つの小さな設定で新たなblogを構築できます。
アプローチ
WordPressはblogの記事や設定値をデータベースに入れて保存しています。HTTPでアクセスしてきた時に、指定されたURLのpathによってWordpressが参照するテーブル(データベース)の場所を動的に変えることにより1つのWordpress設置で、複数のWordpressのblogを構築できます。
設定
アクセスされたURLのpathとテーブル名の関連付けを行います。
編集するファイルは、Wordpress管理ディレクトリのトップにあるwp-config.phpです。
下の例は、
http://matsu.tymy.net/blog/
をメインとして運用して、
http://matsu.tymy.net/milklog/
をサブとして運用する場合の例です。
/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による設定を選んでください。
1 シンボリックリンク
指定したpathでアクセスしたときに、Wordpressのファイルを参照するようにシンボリックリンクを張ります。
1つめの引数にWordpressの実態、2つめの引数に新たに追加するblogのpathを指定します。
# wordpressが設置されているディレクトリの上で。 % ln -s blog milk_log
2 .htaccess
新たなpathでアクセスされたときにWordpressの実体へアクセスするようにする.htaccessです。
以下に例を載せておきます。
RewriteEngine on
RewriteBase /~matsu/
# rewrite milk blog
RewriteRule milklog/(.*) /blog/$1
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule milklog/(.*) /blog/index.php [L]
# /end of rewrite milk blog
アイディア元はこちら。
http://ameblo.jp/curiouseverything/entry-10167447535.html
新しいblogの設定
新しいblogのwordpress管理画面へアクセスするとblogの初期設定を行う画面が表示されます。
例:
http://matsu.tymy.net/milklog/wp-admin/
注意
WordPressによって保存されたファイル、例えばSitemapのXMLファイルなどはデータベースではなくファイルに保存されます。よって、sitemapのファイル名は各blogで別にしなければなりません。
(sitemapやrobots.txtはWebサーバ側でrewriteまたはaliasmatchしてあげるのがいいです)
WordPress2.5以降で動作確認しています。Wordpress3.3でも稼働しています。
Wordpressのアップグレードに影響されない普遍性の高い設定なので、おすすめです。
関連記事
This entry was posted by Yuki Matsukura on 2008/2/5 火曜日 at 4:23:24, and is filed under Wordpress. Follow any responses to this post through RSS 2.0.You can leave a response or trackback from your own site.
-
#3 written by yuki 4 years ago
-
#9 written by snt-f 3 years ago
-
#11 written by snt-f 3 years ago
matsu様
返信ありがとうございます。
ただ、ちょっとわからないのですが、
> blogの定義を追加するとともに、ユーザアカウントを追加する必要がありますね。
上記のそれぞれのやり方がわからないのですが、ご教示いただけませんでしょうか。ユーザーアカウントは、普通にwp-adminで作成するものなのでしょうか。また、そのユーザーのブログの定義はwp-config.phpで 設定したシンボリックリンクのディレクトリ名を
/wp-admin/options-general.php
のWordPress のアドレス(URL)で指定すると言うことなのでしょうか?いちおう試してみたのですが、どうもうまく動きません。。
何度もお手数ですが、ご教示いただければ幸いです。 -
ユーザアカウント作成の前に、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から初期化を行います。
-
#18 written by toma_max 3 years ago
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の知識がほとんどないもので。
すみませんが、よろしくお願いします。 -
問題はご察しの通りだと思います。
この記事のやりかたは、blogのpathを元にテーブル名を変更しています。
$prefix_arrayの定義をご自分の環境に合わせていただく必要があります。上記の例で言えば、/~matsu/milklogはアクセスするblogの新しいpath。http://www.example.com/~matsu/milklog の場合の設定です。
デバッグするためには、以下のコードを追加したコードの最後に追加してみてください。自分の想定するテーブル名のプレフィックスになれば正しく設定できています。
print $table_prefix;
exit;がんばってください。何か不明点あったらまた書き込んでください。
-
#22 written by toma_max 3 years ago
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様の紹介されている手順を踏んでいますが、そのやり方が誤っているという可能性はありますか?
ご教授よろしくお願いします。
-
返信遅くなってすいません。
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 -
#25 written by suzuki 2 years ago
こんにちは。はじめまして。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すればよいだけ(?)なので)イイかなと思ったのですが・・・そうはうまく行かないものでしょうか。 -
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%動的に算出するのは危険です。 -
#27 written by suzuki 2 years ago
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%動的に算出するのは危険です。
安全面については一応考えているつもりではありますが、再考したいと思います。ご助言、ありがとうございます。 -
#30 written by suzuki 2 years ago
matsu様
先日はありがとうございました。suzukiです。
まだ試行錯誤中ですが、報告にあがりました。pdo-for-wordpressというプラグインを用いて、sqliteにて運用しようとしたのですが、どうもこのプラグイン、$table_prefixを無視して’wp_’意外は受け付けず、むしろ’wp_’以外を設定したらエラー、データベース名もこちらで決めたものではなく、MyBlogというデータベース名で勝手に作成という、ちょっと困ってしまう仕様になっておりました。
MySQLはMTと同様、ライセンス周りで細かいところがあるので、sqliteで運用することに拘りたいと思っております。
よってmatsu様の方法は使えなくなってしまいました。
悲しいですが、cp -Rで我慢しておこうと思います。
(プロセスが無駄に立ち上がるんだろうなぁ・・・と今から滅入ってしまいますが)
こちらで身に付けさせていただきました知識は大切にします。
ありがとうございました。失礼いたします。 -
#31 written by super_shirou 2 years ago
matsu様
はじめまして。
wordpressで複数ブログを運営する方法、大変参考になりました。
記事をお書きになってずいぶん経っているので、返答していただけたらありがたく思います。教えていただきたいのは作成した複数ブログにサブドメインを割り当てる方法です。
、
作成した子ブログのURLは
http://www.tymy.net/~matsu/milklog/
となりますが、http://www.milklog.tymy.net
というサブドメインを取得していた場合、
こちらのURLに変換させることは可能でしょうか?
可能でしたら是非方法を教えていただけないでしょうか? -
同じ要領で可能ですよ。
試していませんが、以下のロジックで行けると思いますよ。
// determine table prefix according to the REQUEST_URI $host_array = array( 'www.milk.tymy.net' => 'wp_milklog_' ); if($host_array){ $host = $_SERVER['HTTP_HOST']; foreach($host_array as $search_host => $search_table_prefix){ if(strpos($host, $search_host) === false){ continue; } $table_prefix = $search_table_prefix; } } -
おそらくPHPの問題ではないです。
以下のテストコードで動いたので、上記のコードはあってます。ステップバイステップで問題を特定していった方がいいですね。< ?php // for test $_SERVER['HTTP_HOST'] = 'www.milk.tymy.net'; // determine table prefix according to the REQUEST_URI $host_array = array( 'www.milk.tymy.net' => 'wp_milklog_' ); if($host_array){ $host = $_SERVER['HTTP_HOST']; foreach($host_array as $search_host => $search_table_prefix){ if(strpos($host, $search_host) === false){ continue; } $table_prefix = $search_table_prefix; } } print $table_prefix; -
- コメントのフィード


こんにちは、はじめまして。
Wordpressで一つの管理画面で複数blogを運用したくて、
情報を探していてたどりつきました。
初心者のため、まつぼっくりさんの方法を試してみたのですが、
うまくいきません。もう少し詳しく教えてもらえませんか?
wordpressは二つインストールする必要があるんですか?
とても初歩的な事をきいているとは思うのですが、とても困っていて
お返事をいただきたいです。宜しくお願いします。