2010/12/22追記 WordPressのCodexにユーザーテーブルを変更する方法が書いてあったので、こんなことやらなくても大丈夫っぽいです。
たった今やったらできたので、ご報告です。
WordPressというのは、ほんとうに簡単なCMSなので、ドのつく素人でもすぐに利用することができます。
ところが、WordPressでサイト運営を続けていると、こんな欲望がでてきます。
- とりあえず最初のサイトはローンチできたぞ
- このサイトでは家計簿のつけかたについて書いてきたけど、料理についても書きたいな
- 料理と家計簿ではコンテンツの内容がちょっと違うな
- レイアウトも変えたいし、もうひとつWordPressをインストールしよう
- 家計簿サイトはhttp://example.comにWordPressをインストールして作ったから、料理はhttp://cook.example.comにインストールしよう。
自分しか更新しないサイトならこれでもまったく問題ないですが、複数のユーザがコンテンツを更新するようなサイトを作っていたりすると、目も当てられません。
「料理のサイトってどうやって更新するんだっけ?」というどうでもいい問い合わせにイラつく日々が訪れます。
しかし、それはあなたが悪いのです。なぜ、XoopsやOpenPNEなどといったユーザ管理のしっかりしたCMSを採用しなかったのですか? SymfonyやSmartyが面倒臭すぎるからですか? OpenIDとかの利用は検討しなかったのですか?
Yes, we can. あなたがWordPressにこだわった理由はわかります。なので、作ってみました。
この方法が対象としているのは、データベースが1個しか作れないような共有レンタルサーバで、わからないなりに一生懸命サイトを運営している方です。
あと、バージョンは2.7.1しか試していないので、外のバージョンを利用している方は利用を考え直してください。
また、いやしくもプログラマやDBエンジニアとして口を糊している方は採用しないのが懸命です。もっといい方法があります。
複数のWordPressでユーザ情報を共有する方法
この方法を行うには、以下の要件を満たしている必要があります。
- ユーザ情報を共有するWordPressはすべて同じデータベースに保存されている。(チカッパとかさくらとかを利用している)
- インストールされているWordPressのバージョンはすべて同じである
- WordPress2.6から採用されたwp-config.php内の「認証用ユニークキー」はまったくいじったことがない。
では、説明します。
まず、マスターとなるWordPressを決めてください。そのWordPressで使用しているテーマのfunctions.phpに以下のコードを記入してください。なかったら作ってください。
普通にコピペすると行番号が入るので、それは消してください。
$takahashi_copy_user_info_arr = array();
function takahashi_copy_user_info($id){
global $wpdb;
global $table_prefix;
global $takahashi_copy_user_info_arr;
foreach($takahashi_copy_user_info_arr as $prefix):
$wpdb->query("TRUNCATE TABLE ".$prefix."users");
$sql = "INSERT INTO ".$prefix."users (".
"ID,".
"user_login,".
"user_pass,".
"user_nicename,".
"user_email,".
"user_url,".
"user_registered,".
"user_activation_key,".
"user_status,".
"display_name)".
"(SELECT ID,".
"user_login,".
"user_pass,".
"user_nicename,".
"user_email,".
"user_url,".
"user_registered,".
"user_activation_key,".
"user_status,".
"display_name FROM ".$table_prefix."users)";
$wpdb->query($sql);
$sql = "INSERT INTO ".$prefix."usermeta (".
"umeta_id,".
"user_id,".
"meta_key,".
"meta_value)".
"(SELECT umeta_id,".
"user_id,".
"meta_key,".
"meta_value FROM ".$table_prefix."usermeta)";
$wpdb->query("TRUNCATE TABLE ".$prefix."usermeta");
$wpdb->query($sql);
$sql = "UPDATE ".$prefix."usermeta SET meta_key=REPLACE(meta_key,'".$table_prefix."','".$prefix."') WHERE meta_key LIKE '".$table_prefix."%'";
$wpdb->query($sql);
endforeach;
add_action('profile_update',"takahashi_copy_user_info",1000);
これをfunctions.phpにコピーしたら、$takahashi_copy_user_info_arr = array();という行のarray()のカッコ内にコピー先のWordPressのテーブル接頭辞をカンマ区切りで書いてください。
$takahashi_copy_user_info_arr = array("wp1_","wp2_","wp_3");
これでユーザが情報を更新するたびに指定したWordPress内でユーザ情報が共有されると思います。prepareメソッドは泥酔しているので使いませんでした。SQLインジェクションしてくるユーザは即刻村八分にしたほうがいいと思います。
駄目だったらコメント欄に書いていただければお返事します。
だったらWordPress MU使えば? という声が聞こえてきそうですが、MUは今後に期待ですね。インストール面倒だし。