Word

Hi, I detected your main language is not Japanese. I have an english version of about me, so please try it!

この投稿は8年半前の記事です。 情報が古くなっている可能性があるので、その点ご了承ください。
2009 年 7 月 7 日 2,956日前)
3,723文字 (読了時間9分)

SPONSORED LINK

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

 

SPONSORED LINK

この記事について

この記事はが2009 年 7 月 7 日にプログラミングの記事として公開しました。

フォローしてください

ここで会ったのもなにかの縁。
高橋文樹.comの最新情報を見逃さないためにもフォローをお願いします。
めったに送らないメルマガもあります。