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は今後に期待ですね。インストール面倒だし。