Пользователь электронной почты при сбросе пароля администратором


Я действительно новичок в программировании WordPress, и я даже не уверен, существует ли эта функция. Что я пытаюсь сделать, так это отправить электронное письмо пользователям (не администраторам), когда администратор меняет свой пароль/адрес электронной почты?

В настоящее время, когда я добавляю нового пользователя, им отправляется электронное письмо, но им не отправляется электронное письмо, когда я меняю их пароль/адрес электронной почты.

Я буду очень признателен за любую помощь здесь.

Author: butlerblog, 2014-09-10

3 answers

Вот один из способов добавить эту функцию, используя следующую поточную линию:

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

Шаг №1 - Флажок HTML:

Сначала мы добавим флажок Отправлять уведомление над текстовыми полями пароля, и он будет виден только администратору:

Checkbox

Путем захвата фильтра 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;
}

Шаг №2 - Главный контроллер:

Далее мы хотим подключиться к profile_update из пользовательских опций страница:

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

Где основная логика заключается в функции 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;
    }
}

Потому что тогда все проверки были проведены.

Немного сложно отображать сообщения об ошибках/успехах, потому что WordPress использует перенаправление при обновлении страницы параметров пользователя. Поэтому мы используем трюк с фильтром wp_redirect, чтобы добавить соответствующую переменную запроса, чтобы мы могли определить сообщение из крючка 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 );
}

Шаг #3 - Отправить электронная почта:

Мы используем модификацию основной функции wp_new_user_notification() для отправки электронной почты:

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

Шаг №4 - Уведомления администратора об успехе или ошибках:

Мы используем следующие уведомления администратора, определяемые переменной запроса wp_notices, добавленной в фильтр 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
}

Как очистить пароль?

Обратите внимание, что я использую sanitize_text_field() чтобы очистить пароль в электронном письме. Я не уверен, что это лучший способ сделать это. Около по крайней мере, я не хотел отправлять его в сыром виде по электронной почте. Вот причина этого дополнительного сообщения об ошибке:

Error 1

Просто для того, чтобы мы могли обработать случай, когда пароль содержит некоторые символы, которые удаляются функцией sanitize_text_field(). Любые другие идеи приветствуются.

PS: Это экспериментальное решение, и, возможно, потребуется внести некоторые коррективы. Приведенный выше код полностью процедурный и без каких-либо анонимных функций. Это может стать намного проще, если намазать на него немного масла ООП;-)

 13
Author: birgire, 2014-09-11 09:35:37

Есть несколько способов сделать это;

1) [легко] Отправьте своего пользователя на экран входа в систему и попросите его инициировать процесс "забыли пароль"

2) [умеренные] плагины (есть несколько) бесплатные плагины WordPress, это выглядит полезным , или вы можете поискать http://wordpress.org/plugins/search.php?q=reset +пароль и, вероятно, множество коммерческих, но вот один

3) [жесткий] Пользовательский напишите функцию в своем собственном плагине - для этого вы можете обратиться к Кодексу WordPress, а также здесь кажется разумным учебником

 2
Author: Sol, 2014-09-10 10:56:26

Начиная с WordPress 4.3.0, для этого есть фильтр (расположен в 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
Author: rassoh, 2017-08-23 13:33:50