登録フォームに記入した後に送信されるEメールのリンクをクリックすると、ユーザー名とパスワードを入力せずにユーザーが自動的にログインするようにします。
どうやってやるの?
これが基本的なアプローチです。
まず、ユーザーをログインさせるために使用できるユーザー情報をリンクに渡す必要があります。これを行うには、ユーザー宛ての電子メールをフィルタリングする必要があります。 (実際にはカスタムの新規ユーザー登録Eメールをロードすることは可能ですが、その機能はプラグ可能な機能であるため、これはプラグインとして実行する必要があります。登録メールの場合)
//登録メール本文にフィルタを追加
add_filter( 'wp_mail', 'set_up_auto_login_link' );
function set_up_auto_login_link( $atts ) {
// if the email subject is "Your username and password"
if ( isset ( $atts ['subject'] ) && $atts['subject'] = 'Your username and password' ) {
if ( isset( $atts['message'] ) ) {
$old = '/wp-login.php';
$new = '/wp-login.php?user=' . $_POST['user_login'];
$atts['message'] = str_replace( $old, $new, $atts['message'] );
}
}
return $atts;
}
これにより、登録フォームから選択されたユーザー名がログインリンクに追加されたクエリ文字列の形式で電子メールに送信されます。そのユーザー名は、ユーザーがリンクをクリックしたときにログインするために使用できます。
これを行うために、私はinitアクションに夢中になりました。これはクエリ文字列内の "user"パラメータをチェックします。存在する場合は、get_user_byを使用して、ユーザー名でユーザーデータを取得します(ログイン)。それが有効なユーザーを返す場合、ユーザー名と取得したユーザーIDを使用してユーザーをログインさせることができます。
add_action( 'init', 'log_user_in' );
function log_user_in() {
if ( isset( $_GET['user'] ) ) {
// get the username from the URL
$user_login = $_GET['user'];
// get the user data (need the ID for login)
$user = get_user_by( 'login', $user_login );
// if a user is returned, log them in
if ( $user && ! user_can( $user->ID, 'manage_options' ) ) {
wp_set_current_user( $user->ID, $user_login );
wp_set_auth_cookie( $user->ID );
do_action( 'wp_login', $user_login );
wp_redirect( home_url() );
exit();
}
}
}
有効なユーザ名を持つ人なら誰でもそのユーザとしてログインできるので、このプロセスでは本当のセキュリティは得られません。ログインしているユーザーが管理者でないことを確認するためのチェックを行います(user_can( 'manage_options'))。そうしないと、管理ユーザーログインを持つユーザーがアクセスできる可能性があります。追加のチェックを組み込むのが賢明でしょう - おそらくリンクに追加するためのキーやハッシュを作成します。これは登録時に行われ、ユーザーの検証に使用される可能性があります。