fbpx

メニュー

複数のWordPressでユーザ情報を共有する

高橋文樹 高橋文樹

この投稿は 14年半 前に公開されました。いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。

2010/12/22追記 WordPressのCodexにユーザーテーブルを変更する方法が書いてあったので、こんなことやらなくても大丈夫っぽいです。

たった今やったらできたので、ご報告です。

WordPressというのは、ほんとうに簡単なCMSなので、ドのつく素人でもすぐに利用することができます。

ところが、WordPressでサイト運営を続けていると、こんな欲望がでてきます。

  1. とりあえず最初のサイトはローンチできたぞ
  2. このサイトでは家計簿のつけかたについて書いてきたけど、料理についても書きたいな
  3. 料理と家計簿ではコンテンツの内容がちょっと違うな
  4. レイアウトも変えたいし、もうひとつWordPressをインストールしよう
  5. 家計簿サイトは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は今後に期待ですね。インストール面倒だし。

すべての投稿を見る

高橋文樹ニュースレター

高橋文樹が最近の活動報告、サイトでパブリックにできない情報などをお伝えするメーリングリストです。 滅多に送りませんので、ぜひご登録お願いいたします。 お得なダウンロードコンテンツなども計画中です。