ユーザーを新しいシステムに移行する際の暫定措置として、ユーザーが古いシステムにログインすると、そのユーザーは新しいシステムに転送され、ユーザーIDに基づいて新しいアカウントに自動的にログインするという解決策を考案しました。
古いシステムのコードは次のようになります。
function client_redirect_select_users($user_login, $user) {
$user_id = $user->ID;
$redirect_user = get_user_meta($user_id, 'client_redirect_user', true);
if (intval($redirect_user) == 1) :
$redirect_user_id = get_user_meta($user_id, 'client_redirect_user_id', true);
/* Construct fancy string to obscure user id */
wp_redirect('http://sillysite.com/?user_redirect='.$redirect_user_string);
exit();
endif;
}
add_action('wp_login', 'client_redirect_select_users', 10, 2);
新しいシステムのコードは次のようになります。
function client_auto_login() {
if (!is_user_logged_in()) :
if (isset($_GET['user_redirect'])) :
$user_login_string = intval($_GET['user_redirect']);
/* Do some fancy stuff to extract user id from the GET string */
$user_data = get_userdata($decrypted_user_id);
if ($user_data) :
$user_login = $user_data->user_login;
wp_set_current_user($user_id, $user_login);
wp_set_auth_cookie($user_id, true);
do_action('wp_login', $user_login);
endif;
endif;
endif;
}
add_action('init', 'client_auto_login');
ユーザーは正しくログインしており、自分のデータを見ることができます。しかし、彼らがページ上のリンクをクリックすると、彼らは再びログアウトされます。どうして? :(これを行うより良い方法はありますか?私は古いシステムからユーザーパスワードを送信して(ちょっとした暗号化はcを使って)、代わりにwp_signon()を使うべきですが、私はしたくありません。
助けて?
(これは安全な解決策ではないことを私は110%認識していますAT ALL。しかし、新しいシステムを完全に稼働させるまでの数週間は暫定的な手段です。また、ユーザーログイン文字列を見たり、ランダムなユーザーIDを指定したりするだけでアカウントにアクセスする方法もすぐにはわかりません。いくらかの努力で推測されます)。
結局、wp_signon()が解決策でした。クッキーは明らかに私が使っていたコードでは設定されていなかったからです。私はパスワードの必要性を回避するためにこの解決策 https://Gist.github.com/iandunn/8162246 に従い、これらの関数をfunctions.phpに追加しました。
また、自動ログインコードを 'init'からtemplateに移動して、ヘッダーが送信されるかhtmlが出力される前に実行されるようにしました(wp_head()の上)。
だから今それはこのようになります:
if (!is_user_logged_in()) :
if (isset($_GET['user_redirect'])) :
$user_login_string = intval($_GET['user_redirect']);
/* Fancy user id retrieval stuff */
$user_data = get_userdata($decrypted_user_id);
if ($user_data) :
$user_login = $user_data->user_login;
$loggedin = programmatic_login( $user_login ); // <--- Gist function
if ($loggedin) :
wp_redirect('/userpage');
exit();
endif;
endif;
else :
wp_redirect(wp_login_url());
exit;
endif;
endif;
そしてそれはうまくいっています。