Đâ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:
bằng cách chiếm quyền điều khiển show_password_fields
bộ 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_update
từ 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_redirect
bộ 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_notices
hook:
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_notices
biến truy vấn được thêm vào wp_redirect
bộ lọc:
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:
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ó ;-)