WordPressマルチサイトを使うと、簡単に複数サイトを作れる反面、ユーザー登録する際に、user IDが重複しやすくなる。
そこで、user_login の前に {blog_id}_ をつけることで、重複を回避してみる。
フロントエンドでの自作スクリプトからユーザー登録時する際には
$blog_user_login = get_current_blog_id() . '-' . $user_login;
のようにuser_loginを変え、この値を user_login の値として wp_insert_user() に渡す。
ログイン時の認証には、authenticate hookを改造して使う。
add_filter( 'authenticate', 'multisite_authenticate', 10, 3 ); function multisite_authenticate( $user, $username, $password ){ if (!empty($username)) { $blog_id = get_current_blog_id(); $temp = explode( '-', $username ); if( $temp[0] != $blog_id ) $username = get_current_blog_id() . '-' . $username; $user = get_user_by( 'login', $username ); if ( $user && wp_check_password( $password, $user->data->user_pass, $user->ID ) && is_user_member_of_blog( $user->ID, $blog_id ) ) { return $user; } else { // stop login return null; } } return $user; }
こうすることで、利用者は登録する際には好きなidを入れられるが、WPのusersテーブルのuser_loginには {blog_id}-{user_login}が保存される。
利用者がログインするときは、 {blog_id}を意識せず、 user_login の値だけでログインできる。