Eu tentei algumas abordagens diferentes para verificar o email do usuário. Por enquanto, o que estou fazendo é isto:
Quando um usuário se registra pela primeira vez, defina o user_metadata do usuário 'email_not_verified' como 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 );
}
Em seguida, substitua a função wp_new_user_notification
para que adicione uma 'email_verification_key' à URL de login. Também salva essa chave como user_metadata.
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);
}
Em seguida, conecte-se à ação 'validate_password_reset' para verificar se a chave de verificação de e-mail da solicitação de redefinição de senha corresponde à chave salva. Se as chaves não corresponderem, exclua o usuário e redirecione-o de volta ao formulário de registro com um erro "emailnotverified". Se as chaves coincidirem, exclua os metadados "email_not_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' );
}
}
}
Se o e-mail não for confirmado, adicione uma mensagem que será exibida na página de registro quando houver um erro "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;
}
}
Dentro da função Single Sign On, se o usuário tiver os metadados 'email_not_verified', não os registre no aplicativo cliente. (Isso pode acontecer se o usuário tiver sido criado por meio de um formulário de registro que foi adicionado por um plug-in).
$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;
}
Também adicionei uma caixa de seleção para exibir e substituir o status de verificação de e-mail do usuário na página "edição do usuário".
Editar:
Conectar-se à ação validate_password_reset
provavelmente não é a melhor maneira de fazer isso. Ele é chamado antes que a senha seja redefinida, portanto, o email será verificado mesmo se houver erros no processo de redefinição de senha (por exemplo, se a chave expirou ou é inválida).
Uma abordagem melhor parece ser ligar-se à ação resetpass_form
e adicionar um campo oculto ao formulário de redefinição de senha que contém o valor de 'mail_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 ) . '" />';
}
}
É possível, então, conectar-se à ação after_password_reset
para verificar a chave de e-mail salva em relação ao valor $_POST['mail_key']
.
Um exemplo de plug-in pode ser encontrado aqui: plug-in de verificação de endereço de e-mail