web-dev-qa-db-ja.com

登録後のWordPress自動ログインが機能しない

登録後にユーザーを自動的にログインさせる方法を見つけようとしている一連のスレッドを調べ、これを思いついた。

function automatically_log_me_in( $user_id ) {
    $user = get_user_by('id',$user_id);
    $username = $user->user_nicename;
    $user_id = $user->ID;
    wp_set_current_user($user_id, $username);
    wp_set_auth_cookie($user_id);
    do_action('wp_login', $username, $user);
    exit;
}
add_action( 'user_register', 'automatically_log_me_in' );

私が見た多くの回答によると、wp_set_auth_cookiewp_set_current_userだけでユーザーをIDでログインするのに十分であるはずですが、これでも何もしていません。

誰かが私が間違っていることについて何か考えを持っていますか?

5
Overcode

簡単な答え - あなたのオリジナルの機能は(大部分)はたらきます。これはあなたの関数が必要なことをするために編集されたものです:

function automatically_log_me_in( $user_id ) {
    wp_set_current_user( $user_id );
    wp_set_auth_cookie( $user_id );
    wp_redirect( home_url( '/some-ending-page/' ) );
    exit(); 
}
add_action( 'user_register', 'automatically_log_me_in' );

長い答え - これがなぜこれが答えなのかの説明です。

wp_signon()の提案はそれをしません。そのためのユーザー資格情報が必要です。資格情報を渡すのを禁止すると、その関数はフォームから投稿されたユーザー名( 'log')とパスワード( 'pwd')を取得しようとします。

他の答えは残念ながらこの特定の例には適用されないことを示唆しています。プラグイン固有の提案がいくつかあります。そのうちの1つ(WP-Members)の開発者として、私があなたにそのプラグインを使用してほしいのと同じくらい、あなたがWP-Membersを使用していないならwpmem_post_register_dataを使用することはあなたには役に立ちません。

元の考えとしてwp_set_current_user()を使用するのが正しい方法です。しかし 最後にユーザーをリダイレクトする必要があります ログインしているように見えます。

user_registerアクションは登録されたばかりのユーザーのIDを渡すので、既に値がある場合に$user_idに設定して$user->IDの値を変更する理由がよくわかりません。元の関数でユーザーオブジェクトを取得する唯一の理由は、ユーザー名を取得することです。これはwp_set_current_user()wp_loginアクションのオプションの引数なので、気にしないでください。 (wp_loginアクションを廃止するのは、外部関数がフックするためのプロセスにフックを追加することだけであるためです。これを行うには、OPが提供する以上の情報が必要になります。)コード、IMO。

あなたの登録プロセスはこの時点で終わりますか?認証クッキーが設定され、ユーザーがログインしています。しかし、それは次のページのリクエストまで読まれないので、wp_redirect()を使用してユーザーを終了させたいページにリダイレクトする必要があります。 exit()が必要です。

2
butlerblog

私はwp-login.phpに誘導するカスタム登録フォームでユーザーを登録しています

それなら wp_signon functionを使うことができます。別の解決策を提案するための詳細を提供してください。

1
phpsmashcode

wp-login.phpを宛先とするカスタム登録フォームでユーザーを登録しています。それでしょうか。

これらの機能を試してください。最初のページでリダイレクトするページを選択できます。 2番目のものはあなたが試みていたものにもっと似ています。彼らは働くか助けるかもしれません。

add_action( 'tml_new_user_registered', 'tml_new_user_registered' );
function tml_new_user_registered( $user_id ) {
    wp_set_auth_cookie( $user_id, false, is_ssl() );
    wp_redirect( admin_url( 'profile.php' ) );
    exit;
}

または

add_action( 'wpmem_post_register_data', 'my_registration_hook', 1 );
function my_registration_hook( $fields ) {
    $user_login = $fields['username'];
    $user_id = $fields['ID'];

    wp_set_current_user( $user_id );
    wp_set_auth_cookie( $user_login );
    do_action( 'wp_login', $user_login );

    wp_set_current_user( $fields['ID'] );
}
1
matthew

ヘッダがクライアントに送信される前にこのコードを実行する必要があります。ログインコードを分離してみてください。

この質問はほぼ1年前なので、何かうまくいった場合はどうすればいいか教えてください。

0