我尝试了几种不同的方法来验证用户的电子邮件。现在,我要做的是:
当用户首次注册时,将用户的user\\u元数据“email\\u not\\u verified”设置为1。
add_action( \'user_register\', \'sc_user_email_not_verified\' );
function sc_user_email_not_verified( $user_id ) {
update_user_meta( $user_id, \'email_not_verified\', 1 );
}
然后,覆盖
wp_new_user_notification 功能,以便将“email\\u verification\\u key”添加到登录url。它还将该密钥另存为user\\u元数据。
function wp_new_user_notification( $user_id, $depreciated = null, $notify = \'\' ) {
...
$email_verification_key = wp_generate_password( 20, false );
update_user_meta( $user_id, \'email_verification_key\', $email_verification_key );
$message = sprintf(__(\'Username: %s\'), $user->user_login) . "\\r\\n\\r\\n";
$message .= __(\'To set your password, visit the following address:\') . "\\r\\n\\r\\n";
$message .= \'<\' . network_site_url("wp-login.php?action=rp&key=$key&mail_key=$email_verification_key&login=" . rawurlencode($user->user_login), \'login\') . ">\\r\\n\\r\\n";
$message .= wp_login_url() . "\\r\\n";
wp_mail($user->user_email, sprintf(__(\'[%s] Your username and password info\'), $blogname), $message);
}
然后,挂接“validate\\u password\\u reset”操作,检查密码重置请求中的电子邮件验证密钥是否与保存的密钥匹配。如果密钥不匹配,请删除该用户并将其重定向回注册表,错误为“emailnotverified”。如果密钥确实匹配,请删除“email\\u not\\u verified”元数据。
add_action( \'validate_password_reset\', \'sc_verify_user_email\', 10, 2 );
function sc_verify_user_email( $errors, $user ) {
if ( isset( $_REQUEST[\'mail_key\'] ) ) {
$email_verification_key = $_REQUEST[\'mail_key\'];
$saved_key = get_user_meta( $user->ID, \'email_verification_key\', true );
if ( ! ( $email_verification_key === $saved_key ) ) {
require_once( ABSPATH . \'wp-admin/includes/user.php\' );
wp_delete_user( $user->ID );
wp_redirect( network_site_url( "wp-login.php?action=register&error=emailnotverified" ) );
exit;
} else {
delete_user_meta( $user->ID, \'email_not_verified\' );
}
}
}
如果电子邮件未经验证,请添加一条消息,当出现“emailnotverified”错误时,该消息将显示在注册页面上。
add_filter( \'login_message\', \'sc_email_not_verified_message\' );
function sc_email_not_verified_message() {
$action = isset( $_REQUEST[\'action\'] ) ? $_REQUEST[\'action\'] : \'\';
$error = isset( $_REQUEST[\'error\'] ) ? $_REQUEST[\'error\'] : \'\';
if ( \'register\' === $action && \'emailnotverified\' === $error ) {
$message = \'<p class="message">\' . __( \'Your email address could not be verified. Please try registering again.\' ) . \'</p>\';
return $message;
}
}
在单点登录功能中,如果用户具有“email\\u not\\u verified”元数据,则不要将其登录到客户端应用程序。(如果用户是通过插件添加的注册表创建的,则可能会发生这种情况。)
$current_user = wp_get_current_user();
if ( get_user_meta( $current_user->ID, \'email_not_verified\', true ) ) {
echo( \'Invalid request.\' ); // This needs to be changed to a redirect.
exit;
}
我还添加了一个复选框,用于在“用户编辑”页面上显示和覆盖用户的电子邮件验证状态。
编辑:
钩住validate_password_reset 行动可能不是最好的方式。它在重置密码之前调用,因此即使密码重置过程中有错误(例如,如果密钥过期或无效),也会验证电子邮件
一个更好的方法似乎是resetpass_form 操作并向保存“mail\\u key”值的密码重置表单添加隐藏字段:
add_action( \'resetpass_form\' \'sc_mail_key_field\' );
function sc_mail_key_field() {
if ( isset( $_REQUEST[\'mail_key\'] ) ) {
$mail_key = sanitize_key( wp_unslash( $_REQUEST[\'mail_key\'] ) );
wp_nonce_field( \'verify_email\', \'verify_email_nonce\' );
echo \'<input type="hidden" name="mail_key" value="\' . esc_attr( $mail_key ) . \'" />\';
}
}
然后可以钩住
after_password_reset 根据
$_POST[\'mail_key\'] 价值
可以在此处找到一个示例插件:email address verification plugin