制作の現場から  
  ユーザー情報を複数のサイトで共有する方法
2019
10
Apr

ユーザー情報を複数のサイトで共有する方法

複数のサイトでユーザー情報を共有する方法です

コピペ可能です。ググってもうまく実現できなかった方へ不足していた情報とコピペで実現できるコードをプレゼントします。webで検索すると下記のようにwp-config.phpに追記するようにかいてあります。

前提は
・同じデーターベースを使うこと
・後からインストールするワードプレスのprefixを重複しないものにすること

config.php


define('WP_DEBUG', false);
---------------ここの部分を追記する------------------
define('CUSTOM_USER_TABLE','wp_users');
define('CUSTOM_USER_META_TABLE','wp_usermeta');
-----------------------------------------------
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */

しかしこれだけではうまく機能しません。ユーザーに権限が与えられていないのです。
え?テーブルを共有してるんじゃ?とおもいますね。共有するという意味は、『同じテーブルを使うというだけの意味!』ここがポイントです。

同じテーブルは使いますが保存される情報の一部はサイトによってメタキーが違うのです。以下そのリストです。prefixは無視します。

capabilities, user_level, dashboard_quick_press_last_post_id

これらのメタ情報を書き換えなければ管理者といえども管理画面には入れません。ですので新しくインストールした管理者権限でログインして権限を与えましょう。などと、のんきなことが書いてあります。そんなことできますか?手作業で。
さらに管理者の場合は以下の情報も書き換えなければなりません。

user-settings, user-settings-time

以下その対処法です。

元からあるサイトのfunctions.php


function arumakan_user_update($user_id){
	global $table_prefix;
	$arumakan_prefix = array('wp1_', 'wp2_');//後から追加するワードプレスのprefix。さらに追加する場合は配列に追加すれば可。
	$capabilities = get_user_meta( $user_id, $table_prefix.'capabilities', true );
	$user_level = get_user_meta( $user_id, $table_prefix.'user_level', true );
	$user_settings = get_user_meta( $user_id, $table_prefix.'user-settings', true );
	$user_settings_time = get_user_meta( $user_id, $table_prefix.'user-settings-time', true );
	$dqplpi = get_user_meta( $user_id, $table_prefix.'dashboard_quick_press_last_post_id', true );

	foreach( $arumakan_prefix as $prefix ){

		if( !empty($capabilities) ){
			update_user_meta( $user_id, $prefix.'capabilities', $capabilities );
		}
		if( !empty($user_level) ){
			update_user_meta( $user_id, $prefix.'user_level', $user_level );
		}
		if( !empty($user_settings) ){
			update_user_meta( $user_id, $prefix.'user-settings', $user_settings );
		}
		if( !empty($user_settings_time) ){
			update_user_meta( $user_id, $prefix.'user-settings-time', $user_settings_time );
		}
		if( !empty($dqplpi) ){
			update_user_meta( $user_id, $prefix.'dashboard_quick_press_last_post_id', $dqplpi );
		}
	}
}
add_action('edit_user_profile_update', 'arumakan_user_update' );

get_user_metaは非効率だという方はget_userdataを使ってオブジェクトを取得しましょう。
更に一度に書き換えたいとおっしゃる方にはフックを変えれば実現可能ですね。そのうえでforeachで回せば良いと思います。

勘違いしないでください。ユーザー情報を共有したからといって一つのサイトにログインすれば他のサイトにもログイン状態が共有される訳ではありません。SESSIONを他のサイトにも投げてあげる必要があるからです。

 

top