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.
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
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:
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;
}
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 );
}
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 );
}
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
:
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
}
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:
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 ;-)
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
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);