概要
- 1つのWordpressプログラムで複数のblogを運用したい人向けの記事です。
- この記事で紹介する方法では、.htaccessを設置できる or サーバ上でシンボリックリンクを張れることが前提です。
- この方法なら数行の変更と1つの小さな設定で新たなblogを構築できます。
- Apache向けの設定です。(nginx用の設定ファイルは上手くかけませんでした。)
アプローチ
WordPressはblogの記事や設定値をデータベースに入れて保存しています。HTTPでアクセスしてきた時に、指定されたURLのpathによってWordpressが参照するテーブル(データベース)の場所を動的に変えることにより1つのWordpress設置で、複数のWordpressのblogを構築できます。
設定
アクセスされたURLのpathとテーブル名の関連付けを行います。
編集するファイルは、Wordpress管理ディレクトリのトップにあるwp-config.phpです。
下の例は、
をメインとして運用して、
https://milklog.teraren.com/
をサブとして運用する場合の例です。
/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の初期設定を行う画面が表示されます。
例:
https://milklog.teraren.com/wp-admin/
注意
- WordPress2.5以降で動作確認しています。
- WordPressのアップグレードに影響されない普遍性の高い設定なので、おすすめです。
- (2015/12/3) Worpress 4.3.xでも動作しております。
- (2017/10/31) 共通のファイルを使用すると、テーマやプラグインの管理が煩雑になったり、共通ファイルをblogごとにカスタマイズしたい場合に要求を満たせなくなってきたので1ブログ、1つのWordpressにするようにしました。この方法自体は、今もなお有効です。
メリット
- WordPress本体、plugin , themeのアップグレードが1発で終わる。
- 新規ブログを立ち上げるのに、PHPファイルに数行追加、webサーバの設定に数行追加するだけで完了する。
デメリット
- 画像のアセットが保存されているディレクトリが1箇所なので、全部のブログの画像が1つのディレクトリに保存されてしまう。それによって、ブログを1つ消したときにそれに関連付いた画像を消すのが困難。
- 上記と同様に同様に、テーマファイル、プラグインも混ざる。1つのブログで導入したプラグインが、全部のブログで表示されてしまっていまいち。
Comments
こんにちは、はじめまして。
Wordpressで一つの管理画面で複数blogを運用したくて、
情報を探していてたどりつきました。
初心者のため、まつぼっくりさんの方法を試してみたのですが、
うまくいきません。もう少し詳しく教えてもらえませんか?
wordpressは二つインストールする必要があるんですか?
とても初歩的な事をきいているとは思うのですが、とても困っていて
お返事をいただきたいです。宜しくお願いします。
yukiさん
はじめまして。
コメント書いてくださってありがとうございます。
wordpressは2つインストールする必要はありません。この点が、この記事で書いた方法の利点です。
記事の最初の方にある「こんな人向け」の各項目を理解できるレベルが前提なのですが、こちらの方はクリアですか?
matsuさん
お返事ありがとうございます。
はい、シンボリックリンクという言葉は初めて知りましたが、そのほかは理解できます。
ご説明いただくにどの程度までWordPressの事を私が知っているか必要なんだと思いますが、テンプレートを使わずにページやカテゴリーを作成して10ページ程度のwebサイトを作りました。
ご存じか分かりませんが、毎日コミュニケーションズ出版のWordpressサイト構築スタイルブックの内容が理解できる程度です。
webデザインをメインにしているので、あまりphpの事には詳しくはありません。
matsuさんの方法を理解するにはphpが基本理解できないと難しいですか?
yukiさん。
前提スキルの説明ありがとうございます!
そして、前提となるサーバ環境も重要です。
以下の条件はクリアしてますか?
> サーバ上でシンボリックリンクを張れる。
シンボリックリンクを作れないとこの記事にある手法は使えません。
もし、シンボリックリンクを張れるのであれば、PHPのスキルはさほど必要ありません。
以下の手順で行うのがいいと思います。
1.Wordpressをセットアップ。blogも作る。
2.別のblog用のシンボリックリンク作成
3.wp-config.phpをこの記事に従って編集。
エントリーをお書きになってからだいぶ時間が経っていますが、質問させて下さい。
この方法で複数のblogを運用した場合、WordPressの設定は複数出来るのでしょうか。例えば、ブログタイトル・キャッチフレーズなどです。”ネザーランドドワーフのみるくです!”も拝見したところ、設定できているようでしたので。
よろしくお願いします。
buckeyeさんコメントありがとうございます。
この方法の場合、複数できますよ。
wordpressは設定をデータベースのテーブルへ保存しています。この方法はblogごとに違うテーブルを利用するため、blogごとに独立した設定を行えます。
matsuさん早速お返事頂きありがとうございます。
なるほど、設定もデータベースに保存されるんですね。MySQLの中身をちょっと覗いてみて感動しました。
先に確認しておくべきでした。
実際にこの方法を採用しようと思ったのですが、何がわかっていないのかはっきりしました…シンボリックリンクはどこからどこへ張ればいいのですか?
このエントリーの内容だと、こんな感じですか?
ln -s blog milklog
シンボリックリンクは提示していただいた内容でOKです!
フォーマットはこんな感じです。
matsu様、はじめまして。
上記の情報ありがとうございます。
ただ、ちょっとつまずいていまして、ご教示いただきたく存じます。
wp-config.phpに追記して、シンボリックリンクは張れたのですが、WordPressにアクセスすると、新規のユーザー扱いになってしまいます。
ユーザーはあらかじめ作っておくモノなのでしょうか。。
やりたいこととしては、MTのホスティングライセンスのようなイメージです。ただ、投稿するのは特定のユーザーのみですので、ユーザー登録などは裏側で追加する運用で問題ありません。
よろしくお願いします。
snt-fさん。
Wordpressではユーザ情報はデータベースへ格納されます。この記事の方法を実践すると、データベースは各blogごとに作成されます。
ホスティングサービスとして運用するならば、blogの定義を追加するとともに、ユーザアカウントを追加する必要がありますね。
がんばってっください
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へアクセスすると
https://matsu.teraren.com/~matsu/test/
以下のURLへリダイレクトされます。
https://matsu.teraren.com/~matsu/test/wp-admin/install.php
このURLから初期化を行います。
コメントありがとうございました。
私の方はまだまだワードプレス初級者ですが、いろいろ情報共有していきましょう (^-^)/
はじめまして。
以前wordpressを使っていましたが、当時は重くて、Geeklog に移動したものです。
matsuさんの方法(シンボリックリンクはよく分かりませんので、htaccess)ですと、wordpressを3つ以上のブログを作成することもできるのでしょうか?
ユメさん。
コメントありがとうございます。
.htaccessを使って3つ以上のblogを構築できますよ~!Wordpress本体は、今も重いですね。
キャッシュプラグインなどを利用すれば軽くなりますが、弊害も出ますねぇ。このblogはキャッシュ使っていません。プラグインは15個ぐらい入れてます。すごい重いです。。。
matsuさん
ありがとうございます
複数ブログは魅力ですが、今も重いのですか・・・
でも、このサイトは閲覧させていただく限りは、そんなに重いとは感じませんでしたが、残念です・・・
ユメ さん
この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が描画するのに時間がかかってるみたいですね。
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;
がんばってください。何か不明点あったらまた書き込んでください。
matsu様
回答ありがとうございました。
ただ$prefix_arrayの定義を自分の環境に合わせたのですが、やはりうまくいきません。
すみませんが、もうひとつ質問です。
今はエディタで開いて、コードを追加して、上書き保存しているのですが、デバッグの仕方から見て、コマンドプロンプトを使って編集するのですか?
うまくいきませんかぁ。
設定したコードをコピペしてもらえますか?
また、元々存在するWordpressのURLと新しく設定したいURLを教えてください。
環境は、ローカルのWindowsでしょうか?
デバッグの仕方は、
1.ファイルの変更
2.ブラウザでリロード
の繰り返しですねぇ。
コマンドプロンプトで実行すると、Apacheから設定される環境変数が設定されないので動作しないです。
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
matsu様
ご丁寧に対応していただいて、どうもありがとうございました。
今回は、製作中のサイトは、一旦複数個ワードプレスをインストールしするというところで妥協しました。でもこれからローカルでいろいろ実験していこうと思います。今回matsu様のアドバイスを受けていろいろ試していく中で、たくさん新しい知識の種を得ました。これからがんばって勉強していきます。ありがとうございました。
こんにちは。はじめまして。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%動的に算出するのは危険です。
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%動的に算出するのは危険です。
安全面については一応考えているつもりではありますが、再考したいと思います。ご助言、ありがとうございます。
> symbolic linkを自動生成しているわけではないので、その問題は起こらないような気がします。
確かにそうですね。apacheレベルではじかれますね。
(全ての/~matsu/以下をrewriteすると思いこんでいました)
blog構築応援してます!
matsu様
お返事いただきましてありがとうございます。
また応援いただきまして、誠に恐れ入ります。
お気持ちにお応えできますように、頑張ります。
連想配列についてなど、勉強になりました。ありがとうございました。
(mod_rewriteもうちのサーバにはインストールしてありますので、試せたら試したいと思います)
丁寧迅速なご対応、ありがとうございました。
またコメント欄にて長文乱筆、大変失礼いたしました。
それでは、失礼いたします。
matsu様
先日はありがとうございました。suzukiです。
まだ試行錯誤中ですが、報告にあがりました。
pdo-for-wordpressというプラグインを用いて、sqliteにて運用しようとしたのですが、どうもこのプラグイン、$table_prefixを無視して’wp_’意外は受け付けず、むしろ’wp_’以外を設定したらエラー、データベース名もこちらで決めたものではなく、MyBlogというデータベース名で勝手に作成という、ちょっと困ってしまう仕様になっておりました。
MySQLはMTと同様、ライセンス周りで細かいところがあるので、sqliteで運用することに拘りたいと思っております。
よってmatsu様の方法は使えなくなってしまいました。
悲しいですが、cp -Rで我慢しておこうと思います。
(プロセスが無駄に立ち上がるんだろうなぁ・・・と今から滅入ってしまいますが)
こちらで身に付けさせていただきました知識は大切にします。
ありがとうございました。失礼いたします。
matsu様
はじめまして。
wordpressで複数ブログを運営する方法、大変参考になりました。
記事をお書きになってずいぶん経っているので、返答していただけたらありがたく思います。
教えていただきたいのは作成した複数ブログにサブドメインを割り当てる方法です。
、
作成した子ブログのURLは
http://www.tymy.net/~matsu/milklog/
となりますが、
http://www.milklog.tymy.net
というサブドメインを取得していた場合、
こちらのURLに変換させることは可能でしょうか?
可能でしたら是非方法を教えていただけないでしょうか?
同じ要領で可能ですよ。
試していませんが、以下のロジックで行けると思いますよ。
matsu様
返答していただきありがとうございます。
教えていただいたとおり記述したのですが、Internal Surver Errorとなってしまいました。
英文にはサーバー管理者に問い合わせてくださいといった記述が見受けられたのですが、これはサーバー側に問題があるということでしょうか?
ちなみにXserverを使っています。
おそらくPHPの問題ではないです。
以下のテストコードで動いたので、上記のコードはあってます。ステップバイステップで問題を特定していった方がいいですね。
matsu様
素早い回答ありがとうございます。
やはりPHPは問題ないんですね。
初心者なものでわかりやすそうだった.htaccesを用いる方法でやっているのですが、シンボリックリンクを張る方法も調べて試してみたいと思います。
また助言をお願いするかもしれませんが、そのときはよろしくお願いします。
super_shirouさん
Internal Server Errorは.htaccessのエラーによっても出力されるので、.htaccess周りの設定ミスかサーバがmod_rewriteに対応したい無いといった問題があると思いますよ。
あとは、apacheのerror logを見られるならば、詳細がそこに書いてあると思います。
設定がんばってください!