web-dev-qa-db-fra.com

La connexion automatique à WordPress après l'enregistrement ne fonctionne pas

Je cherchai un tas de threads essayant de comprendre comment connecter automatiquement un utilisateur après l'enregistrement, et je trouvai ceci.

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' );

Selon de nombreuses réponses que j'ai vues, wp_set_auth_cookie et wp_set_current_user seuls devraient suffire à connecter un utilisateur par identifiant, mais même cela ne fait rien.

Est-ce que quelqu'un a une idée de ce que je fais mal?

5
Overcode

Réponse courte - Votre fonction d'origine (la plupart du temps) fonctionne. Voici votre fonction modifiée pour faire ce qu’elle doit faire:

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' );

Réponse longue - voici une explication de la raison pour laquelle c'est la réponse.

La suggestion de wp_signon() ne le fera pas. Vous avez besoin des identifiants de l'utilisateur pour cela, et si vous ne le transmettez pas, cette fonction tentera de récupérer le nom d'utilisateur ("log") et le mot de passe ("pwd") publiés dans le formulaire et je supposerais que "pwd" en serait absent.

Les autres réponses contiennent des suggestions qui, malheureusement, ne s'appliquent pas dans ce cas particulier. Plusieurs suggestions sont spécifiques aux plugins. En tant que développeur de l'un de ceux-ci (membres WP), autant que je souhaite que vous utilisiez ce plugin, suggérer l'utilisation de wpmem_post_register_data ne vous sert à rien si vous n'utilisez pas les membres WP.

Utiliser wp_set_current_user() comme pensée originale est la bonne façon de le faire. mais vous devez rediriger l’utilisateur à la fin afin qu’ils soient considérés comme connectés.

L'action user_register transmet l'ID de l'utilisateur qui vient d'être enregistré. Je ne vois donc pas pourquoi vous voudriez changer la valeur de $user_id en lui attribuant la valeur $user->ID alors que vous en avez déjà la valeur. Et la seule raison d'obtenir l'objet utilisateur dans votre fonction d'origine est d'obtenir le nom d'utilisateur. Ceci est un argument optionnel pour wp_set_current_user() et l'action wp_login donc je ne m'embêterais même pas avec cela. (J'aurais abandonné l'action wp_login car tout ce que vous faites consiste à accrocher les processus externes à votre processus. Si vous le souhaitez, vous avez besoin d'informations supplémentaires par rapport à ce que votre OP fournit.) code, IMO.

Votre processus d'inscription se termine-t-il à ce stade? Le cookie d'authentification est défini et l'utilisateur est connecté. Toutefois, il ne sera pas lu avant la demande de page suivante. Vous devez donc rediriger l'utilisateur vers la page de votre choix en utilisant wp_redirect(), après quoi vous aurez besoin de exit().

2
butlerblog

J'inscris les utilisateurs avec un formulaire d'inscription personnalisé qui dirige vers wp-login.php

Ensuite, vous pouvez utiliser wp_signon function. Fournissez plus de détails pour suggérer une autre solution.

1
phpsmashcode

J'inscris les utilisateurs avec un formulaire d'inscription personnalisé qui renvoie à wp-login.php. Est-ce que ça pourrait être ça?

Essayez l'une de ces fonctions. Vous pouvez choisir la page vers laquelle vous rediriger dans la première. La seconde ressemble plus à celle que vous essayiez. Ils peuvent travailler ou aider.

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;
}

ou

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

Vous devez exécuter ce code avant d'envoyer des en-têtes au client. Essayez de séparer le code de connexion.

Cette question a presque un an, alors merci de nous faire savoir ce qui a fonctionné.

0