Email người dùng khi mật khẩu được đặt lại bởi quản trị viên


7

Tôi thực sự mới đối với lập trình WordPress và tôi thậm chí không chắc tính năng này có tồn tại hay không. Những gì tôi đang cố gắng làm là gửi email cho người dùng (không phải quản trị viên) khi quản trị viên thay đổi mật khẩu / email của họ?

Hiện tại khi tôi thêm một người dùng mới, một email được gửi cho họ nhưng không có email nào được gửi cho họ khi tôi thay đổi mật khẩu / email của họ.

Tôi sẽ thực sự đánh giá cao bất kỳ sự trợ giúp ở đây.

Câu trả lời:


13

Đây là một cách để thêm tính năng này bằng cách sử dụng dòng chảy sau:

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

Bước # 1 - Hộp kiểm HTML:

Trước tiên, chúng tôi thêm hộp kiểm Gửi thông báo phía trên các trường văn bản mật khẩu và nó chỉ hiển thị cho quản trị viên:

Hộp kiểm

bằng cách chiếm quyền điều khiển show_password_fieldsbộ lọc:

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

Bước # 2 - Bộ điều khiển chính:

Tiếp theo, chúng tôi muốn kết nối profile_updatetừ trang tùy chọn người dùng :

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

trong đó logic chính là trong wpse_controller()hàm:

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

bởi vì sau đó tất cả các xác nhận đã diễn ra.

Một chút khó khăn để hiển thị thông báo lỗi / thành công, bởi vì WordPress sử dụng chuyển hướng khi trang tùy chọn người dùng được cập nhật. Do đó, chúng tôi sử dụng một mẹo với wp_redirectbộ lọc để thêm biến truy vấn có liên quan để chúng tôi có thể xác định thông báo từ admin_noticeshook:

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

Bước # 3 - Gửi email:

Chúng tôi sử dụng một sửa đổi của wp_new_user_notification()chức năng cốt lõi để gửi email:

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

Bước # 4 - Thông báo của quản trị viên về thành công hoặc lỗi:

Chúng tôi sử dụng các thông báo quản trị sau, được xác định bởi wp_noticesbiến truy vấn được thêm vào wp_redirectbộ lọc:

Sự thành công Lỗi 1 Lỗi 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
}

Làm thế nào để vệ sinh mật khẩu?

Lưu ý rằng tôi sử dụng sanitize_text_field()để vệ sinh mật khẩu trong email. Tôi không chắc cách tốt nhất để làm điều đó là gì. Ít nhất tôi đã không muốn gửi nó trong email. Đó là lý do cho thông báo lỗi thêm này:

Lỗi 1

chỉ để chúng ta có thể xử lý trường hợp mật khẩu chứa một số ký tự bị tước bởi sanitize_text_field()hàm. Bất kỳ ý tưởng khác được hoan nghênh.

PS: Đây là thử nghiệm và có thể cần một số điều chỉnh. Mã ở trên là tất cả các thủ tục và không có bất kỳ chức năng ẩn danh nào. Nó có thể đơn giản hơn nhiều bằng cách bôi một ít bơ OOP lên nó ;-)


Bạn được chào đón, hy vọng bạn có thể mở rộng nó theo nhu cầu của bạn. Có lẽ đây sẽ là một ý tưởng plugin hay ;-)
birgire

Tôi đang nghĩ giống hệt nhau
Baig

Thay vì đặt câu trả lời của tôi để xấu hổ! Tôi ngạc nhiên vì đây không phải là một plugin!
Sol

@Sol Tôi thích số 1 trong danh sách của bạn, tôi đoán đó là tùy chọn rất bị bỏ qua ;-) Tôi đã không kiểm tra xem đã có plugin cho tính năng này chưa, nhưng nếu tôi có thời gian tôi có thể làm việc với nó và có lẽ các bạn có thể tham gia trong và kiểm tra nó, nếu điều đó xảy ra?
bạch dương

1
Đây là một trong những phản hồi bằng văn bản và đầy đủ nhất mà tôi đã thấy ở đây trong một thời gian - Chỉ cần đủ thông tin để trở thành một phản hồi chắc chắn, trong khi vẫn để người đọc tự hiểu và thực hiện nhiều chi tiết. Làm tốt.
TonyG

2

Có một vài cách để thực hiện điều này;

1) [dễ dàng] Gửi người dùng của bạn đến màn hình đăng nhập và yêu cầu họ bắt đầu quá trình quên mật khẩu

2) [vừa phải] Các plugin (có một vài) plugin WordPress miễn phí, có vẻ hữu ích hoặc bạn có thể tìm kiếm http://wordpress.org/plugins/search.php?q=reset+password và có thể rất nhiều plugin thương mại, nhưng đây là một

3) [hard] Tùy chỉnh viết một chức năng trong plugin của riêng bạn - để bạn có thể tham khảo Codex WordPressở đây có vẻ như một hướng dẫn hợp lý


1

Kể từ WordPress 4.3.0, có một bộ lọc cho cái này (nằm ở 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);

Không chắc chắn điều này sẽ giúp. Móc lọc này có nghĩa là xác định thời tiết để gửi email thay đổi mật khẩu hay không . Bây giờ nó gửi nó theo mặc định. Xin nhắc lại, vấn đề là "Hiện tại khi tôi thêm người dùng mới, một email sẽ được gửi cho họ, điều này thật tuyệt nhưng không có email nào được gửi cho họ khi tôi thay đổi mật khẩu / email của họ."
ClemC

Nó có ích, tôi đang sử dụng điều này trong một dự án sản xuất. Bộ lọc trả về sai cho wordpress, vì vậy email tích hợp sẽ không được gửi. Thay vào đó, bạn có thể gửi email của riêng mình trước tuyên bố trả lại cuối cùng.
rassoh

Vâng, đó là một cách sử dụng thú vị của bộ lọc mà bạn làm cho nó hoạt động giống như một hành động. Nhưng điều đó sẽ hữu ích nếu OP muốn thay đổi email tích hợp và nó không được đề cập ở bất cứ đâu trong câu hỏi. Quan điểm của tôi là nó hơi lạc đề một chút ...
ClemC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.