web-dev-qa-db-fra.com

Email de l'utilisateur lorsque le mot de passe est réinitialisé par l'administrateur

Je suis vraiment nouveau dans la programmation WordPress et je ne suis même pas sûr que cette fonctionnalité existe. Ce que j'essaie de faire est d'envoyer un email aux utilisateurs (pas à l'administrateur) lorsqu'un administrateur modifie son mot de passe/email.

À l'heure actuelle, lorsque j'ajoute un nouvel utilisateur, un courrier électronique leur est envoyé, mais aucun courrier électronique ne leur est envoyé lorsque je change de mot de passe/d'adresse électronique.

J'apprécierai vraiment toute aide ici.

7
Baig

Voici un moyen d'ajouter cette fonctionnalité à l'aide de la flowline suivante:

The admin updates the user option page:

   -> edit_user_profile_update or personal_options_update hooks activated
   -> edit_user() function is called
   -> wp_update_user() function is called within edit_user()
   -> wp_insert_user() function is called within wp_update_user()
   -> profile_update hook activated within wp_insert_user() 
      for user updates, not user inserts
   -> wp_redirect() function called on successful user updates
   -> wp_redirect filter activated
   -> The page reloads
   -> admin_notices hook activated

Étape 1 - La case à cocher HTML:

Premièrement, nous ajoutons le Envoyer une notification au-dessus des champs de texte du mot de passe et il n’est visible que par l’administrateur:

Checkbox

en détournant le filtre show_password_fields:

add_filter( 'show_password_fields', 'wpse_notification_html' );

function wpse_notification_html( $show )
{
    if( current_user_can( 'manage_options' ) ):
?>
    <tr>
        <th scope="row">
            <label for="wpse_send_notification"><?php _e('Send a notification?') ?></label>
        </th>
    <td>
            <label for="wpse_send_notification">
                <input type="checkbox" name="wpse_send_notification" id="wpse_send_notification" value="1" />
                <?php _e( 'Send an email to user and notify that the password has changed.' ); ?>
            </label>
        </td>
    </tr>
<?php
    endif;
    return $show;
}

Étape n ° 2 - Le contrôleur principal:

Ensuite, nous voulons nous connecter au profile_update à partir de options utilisateur page:

add_action( 'edit_user_profile_update', 'wpse_user_update' );
add_action( 'personal_options_update',  'wpse_user_update' );

function wpse_user_update( $user_id )
{
    if( current_user_can( 'manage_options' ) )
        add_action( 'profile_update', 'wpse_controller', 10, 2 );
}

où la logique principale est dans la fonction wpse_controller():

function wpse_controller( $user_id, $old_user_data )
{
    // Input:
    $pass1  = filter_input( INPUT_POST, 'pass1' );
    $pass2  = filter_input( INPUT_POST, 'pass2' );
    $send   = filter_input( INPUT_POST, 'wpse_send_notification', FILTER_SANITIZE_NUMBER_INT );

    // Run this action only once:
    remove_action( current_action(), __FUNCTION__ );

    // Send the notification:
    if( 1 == $send )
    {
       if( ! empty( $pass1 )
           && $pass1 === $pass2
           && sanitize_text_field( $pass1 ) === $pass1
       ):
            if( wpse_user_password_notification( $user_id, wp_unslash( sanitize_text_field( $pass1 ) ) ) )
                add_filter( 'wp_redirect', 'wpse_redirect_notification_success' );
            else
                add_filter( 'wp_redirect', 'wpse_redirect_notification_error' );
       else:
                add_filter( 'wp_redirect', 'wpse_redirect_pass_validation_error' );
       endif;
    }
}

car alors toutes les validations ont eu lieu.

Il est un peu difficile d'afficher des messages d'erreur/de succès, car WordPress utilise un redirect lorsque la page des options de l'utilisateur est mise à jour. Par conséquent, nous utilisons une astuce avec le filtre wp_redirect pour ajouter la variable de requête pertinente afin de pouvoir déterminer le message à partir du hook admin_notices:

function wpse_redirect_notification_success( $location )
{
    return add_query_arg( 'wpse_notification', 'mail_success', $location );
}

function wpse_redirect_notification_error( $location )
{
    return add_query_arg( 'wpse_notification', 'mail_error', $location );
}

function wpse_redirect_pass_validation_error( $location )
{
    return add_query_arg( 'wpse_notification', 'pass_validation_error', $location );
}

Étape # 3 - Envoyez l'email:

Nous utilisons une modification de la fonction de base wp_new_user_notification() pour envoyer l'e-mail:

function wpse_user_password_notification( $user_id, $plaintext_pass = '' )
{
    if ( empty( $plaintext_pass ) )
       return false;

    $user = get_userdata( $user_id );
    $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
    $message  = sprintf( __( 'Username: %s' ),     $user->user_login ) . "\r\n";
    $message .= sprintf( __( 'New Password: %s' ), $plaintext_pass   ) . "\r\n";
    $message .= wp_login_url() . "\r\n";
    return wp_mail( $user->user_email, sprintf(__('[%s] Your username and new password'), $blogname), $message );
}

Étape n ° 4 - Avis de l'administrateur pour les succès ou les erreurs:

Nous utilisons les avis d’administration suivants, déterminés par la variable de requête wp_notices ajoutée dans le filtre wp_redirect:

SuccessError 1Error 2

add_action( 'admin_notices', 'wpse_admin_notices' );

function wpse_admin_notices()
{
    $status = filter_input( INPUT_GET, 'wpse_notification', FILTER_SANITIZE_STRING );

    switch ( $status )
    {
        case 'mail_success':
            ?><div id="message" class="updated"><p><strong>Notification Sent!</strong>: Notification email successfully sent to the user</p></div><?php
            break;  
        case 'mail_error':
            ?><div class="error"><p><strong>ERROR</strong>: Notification email not sent to the user</p></div><?php
            break;
        case 'pass_validation_error':
            ?><div class="error"><p><strong>ERROR</strong>: Notification email not sent to the user, because of symbol chars in the password </p></div><?php
            break;
    } // end switch
}

Comment désinfecter le mot de passe?

Notez que j’utilise la fonction sanitize_text_field() pour effacer le mot de passe contenu dans l’e-mail. Je ne sais pas quelle est la meilleure façon de le faire. Au moins, je ne voulais pas l'envoyer brut dans l'e-mail. C'est la raison de ce message d'erreur supplémentaire:

Error 1

afin que nous puissions gérer le cas où le mot de passe contient des caractères qui sont supprimés par la fonction sanitize_text_field(). Toutes les autres idées sont les bienvenues.

PS: Ceci est expérimental et pourrait nécessiter quelques ajustements. Le code ci-dessus est entièrement procédural et sans aucune fonction anonyme. Cela pourrait devenir beaucoup plus simple en appliquant du OOP beurre dessus ;-)

12
birgire

Il y a plusieurs façons d'accomplir cela.

1) [easy] Envoyez votre utilisateur à l'écran de connexion et demandez-lui de lancer le processus de mot de passe oublié

2) [modéré] Plugins (il y en a quelques-uns) plugins WordPress gratuits, cela semble utile , ou vous pouvez rechercher http://wordpress.org/plugins/search.php?q=reset+password et probablement beaucoup de commerciaux, mais en voici un

3) [Difficile] Personnalisé écrire une fonction dans votre propre plugin - pour cela vous pouvez vous référer au WordPress Codex et aussi ici semble un tutoriel raisonnable

2
Sol

Depuis WordPress 4.3.0, il existe un filtre pour cela (situé dans user.php):

add_filter('send_password_change_email', function( $send, $user, $userdata ){
  // bail early if $send is false
  if( !$send ) {
    return $send;
  }
  // Your custom email logic
  // ...

  // tell wordpress not to send the built-in email
  return false;
}, 10, 3);
1
rassoh