E-Mail-Benutzer, wenn das Passwort vom Administrator zurückgesetzt wird

7

Ich bin wirklich neu in der WordPress-Programmierung und ich bin mir nicht einmal sicher, ob diese Funktion vorhanden ist. Ich versuche, eine E-Mail an Benutzer (nicht an Administratoren) zu senden, wenn ein Administrator sein Passwort / seine E-Mail-Adresse ändert.

Wenn ich einen neuen Benutzer hinzufüge, wird derzeit eine E-Mail an ihn gesendet, aber keine E-Mail an ihn, wenn ich sein Passwort / seine E-Mail-Adresse ändere.

Ich werde mich über jede Unterstützung hier sehr freuen.

Baig
quelle

Antworten:

13

Hier ist eine Möglichkeit, diese Funktion mithilfe der folgenden Flusslinie hinzuzufügen:

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

Schritt 1 - Das HTML-Kontrollkästchen:

Zuerst fügen wir das Kontrollkästchen Benachrichtigung senden über den Kennworttextfeldern hinzu und es ist nur für den Administrator sichtbar:

Kontrollkästchen

durch Entführung des show_password_fieldsFilters:

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

Schritt 2 - Der Hauptcontroller:

Als nächstes möchten wir uns auf profile_updateder Seite mit den Benutzeroptionen einbinden :

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

wo die Hauptlogik in der wpse_controller()Funktion ist:

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

denn dann haben alle Validierungen stattgefunden.

Das Anzeigen von Fehler- / Erfolgsmeldungen ist etwas schwierig, da WordPress eine Umleitung verwendet, wenn die Seite mit den Benutzeroptionen aktualisiert wird. Daher verwenden wir einen Trick mit dem wp_redirectFilter, um die relevante Abfragevariable hinzuzufügen, damit wir die Nachricht aus dem admin_noticesHook ermitteln können:

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

Schritt 3 - Senden Sie die E-Mail:

Wir verwenden eine Modifikation der Kernfunktion wp_new_user_notification(), um die E-Mail zu senden:

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

Schritt 4 - Administratorbenachrichtigungen für Erfolg oder Fehler:

Wir verwenden die folgenden Administratorhinweise, die durch die wp_noticesim wp_redirectFilter hinzugefügte Abfragevariable bestimmt werden:

Erfolg Fehler 1 Fehler 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
}

Wie bereinige ich das Passwort?

Beachten Sie, dass ich das verwende sanitize_text_field(), um das Passwort in der E-Mail zu bereinigen. Ich bin mir nicht sicher, wie ich das am besten machen soll. Zumindest wollte ich es nicht roh in der E-Mail senden. Das ist der Grund für diese zusätzliche Fehlermeldung:

Fehler 1

Nur damit wir den Fall behandeln können, in dem das Passwort einige Zeichen enthält, die von der sanitize_text_field()Funktion entfernt werden. Alle anderen Ideen sind willkommen.

PS: Dies ist experimentell und erfordert möglicherweise einige Anpassungen. Der obige Code ist prozedural und ohne anonyme Funktionen. Es könnte viel einfacher werden, wenn man etwas OOP-Butter darauf schmiert ;-)

Birgire
quelle
Gern geschehen, hoffentlich können Sie es auf Ihre Bedürfnisse ausweiten. Vielleicht wäre das eine nette Plugin-Idee ;-)
Birgire
Ja, ich denke genau das gleiche
Baig
Schämt eher meine Antwort! Ich bin erstaunt, dass dies noch kein Plugin ist!
Sol
@Sol Ich mag # 1 auf deiner Liste, ich denke, das ist eine sehr übersehene Option ;-) Ich habe nicht überprüft, ob es bereits Plugins für diese Funktion gibt, aber wenn ich etwas Zeit habe, könnte ich daran arbeiten und vielleicht könnt ihr mitmachen in und testen Sie es, wenn das passiert?
Birgire
1
Dies ist eine der am besten geschriebenen und vollständigsten Antworten, die ich seit einiger Zeit hier gesehen habe - gerade genug Informationen, um eine solide Antwort zu sein, während es dem Leser überlassen bleibt, viele Details selbst zu verstehen und umzusetzen. Gut gemacht.
TonyG
2

Es gibt einige Möglichkeiten, dies zu erreichen.

1) [einfach] Senden Sie Ihren Benutzer zum Anmeldebildschirm und lassen Sie ihn den Prozess des vergessenen Passworts einleiten

2) [moderat] Plugins (es gibt einige) kostenlose WordPress-Plugins, dies sieht nützlich aus , oder Sie könnten http://wordpress.org/plugins/search.php?q=reset+password und wahrscheinlich viele kommerzielle suchen. aber hier ist einer

3) [schwer] Benutzerdefiniert schreibe eine Funktion in dein eigenes Plugin - dafür kannst du auf den WordPress Codex verweisen und auch hier scheint ein vernünftiges Tutorial

Sol
quelle
1

Seit WordPress 4.3.0 gibt es dafür einen Filter (befindet sich in 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);
rassoh
quelle
Ich bin mir nicht sicher, ob das hilft. Dieser Filter-Hook soll das Wetter definieren , um die E-Mail zur Kennwortänderung zu senden oder nicht . Es sendet es jetzt standardmäßig. Zur Erinnerung: Das Problem lautet: "Derzeit wird beim Hinzufügen eines neuen Benutzers eine E-Mail an ihn gesendet. Das ist großartig, aber es wird keine E-Mail an ihn gesendet, wenn ich sein Passwort / seine E-Mail-Adresse ändere."
ClemC
Es hilft, ich benutze dies in einem Produktionsprojekt. Der Filter gibt false an WordPress zurück, sodass die integrierte E-Mail nicht gesendet wird. Stattdessen können Sie Ihre eigene E-Mail vor der letzten Rückgabeerklärung senden.
Rassoh
Ja, das ist eine interessante Verwendung eines Filters, mit dem Sie ihn auch wie eine Aktion wirken lassen. Dies wäre jedoch hilfreich, wenn das OP die integrierte E-Mail ändern möchte und sie in der Frage nirgends erwähnt wird. Mein Punkt ist, dass es ein wenig vom Thema
abweicht