web-dev-qa-db-fra.com

Personnaliser wp_new_user_notification_email ()

J'essaie de personnaliser le courrier électronique de notification envoyé à l'utilisateur qui contient le lien pour définir un mot de passe.

Actuellement, j'ai configuré un enregistrement d'utilisateur personnalisé et des formulaires de connexion aux URL site.com/register et site.com/login respectivement.

Après l’enregistrement, wordpress envoie un courrier électronique avec le lien suivant qui demande de définir un mot de passe.

site.com/wp-login.php?action=rp&key=XYieERXh3QinbU4VquB2&login=user%40gmail.com

Je veux qu'il remplace cette URL

site.com/login?action=rp&key=XYieERXh3QinbU4VquB2&login=user%40gmail.com

J'ai essayé le code suivant dans functions.php

add_filter( 'wp_new_user_notification_email', 'my_wp_new_user_notification_email', 10, 3 );

function my_wp_new_user_notification_email( $wp_new_user_notification_email, $user, $blogname ) {

    $message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    $message .= __('Hello To set your password, visit the following address:') . "\r\n\r\n";
    $message .= '<' . network_site_url("login/?key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";


    $wp_new_user_notification_email['message'] = $message

    return $wp_new_user_notification_email;

}

Je pense qu'il me manque des informations $key puisque le courrier électronique reçu contient le lien suivant:

site.com/login?action=rp&key=&login=user%40test.com

Comment régler ceci?

1
Nigel

Vous devez pouvoir affecter la clé générée à votre variable $key, qui est actuellement non définie.

Vous pouvez contourner ce problème en associant une autre fonction à l'action retrieve_password_key, qui se déclenche juste après que WordPress ait généré la clé. De par son nom, je pense qu’il existe seulement à cette fin.

function wpse306642_stash_key( $user_login, $key ) {
    global $wpse306642_new_user_key;
    $wpse306642_new_user_key = $key;
}

add_action( 'retrieve_password_key', 'wpse306642_stash_key', 10, 2 );

Puis remplacez $key dans votre fonction par $wpse306642_new_user_key, en le déclarant comme global au début de la fonction.

Utiliser une approche globale juste pour cela donne un sentiment de hacky, mais cela devrait fonctionner.

1

Vous devez utiliser la fonction get_password_reset_key(voir référence) qui interrogera la base de données et renverra la clé de réinitialisation du mot de passe de l'utilisateur.

Voici un exemple de travail complet:

add_filter( 'wp_new_user_notification_email', 'custom_wp_new_user_notification_email', 10, 3 );

function custom_wp_new_user_notification_email( $wp_new_user_notification_email, $user, $blogname ) {
    $key = get_password_reset_key( $user );
    $message = sprintf(__('Welcome to the Community,')) . "\r\n\r\n";
    $message .= 'To set your password, visit the following address:' . "\r\n\r\n";
    $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . "\r\n\r\n";
    $message .= "After this you can enjoy our website!" . "\r\n\r\n";
    $message .= "Kind regards," . "\r\n";
    $message .= "Support Office Team" . "\r\n";
    $wp_new_user_notification_email['message'] = $message;

    $wp_new_user_notification_email['headers'] = 'From: MyName<[email protected]>'; // this just changes the sender name and email to whatever you want (instead of the default WordPress <[email protected]>

    return $wp_new_user_notification_email;
}
1