Проверка электронной почты для новых пользователей
Я хотел бы реализовать плагин, который требует, чтобы новые пользователи отвечали на электронное письмо, подтверждали свой адрес электронной почты при регистрации. Я уже провожу обширные исследования кодекса, но я очень новичок и был бы признателен за некоторые советы, особенно в отношении того, чтобы пользователь оставался неактивным до тех пор, пока он не подтвердит свою электронную почту. С остальным, думаю, я справлюсь сам.
1 answers
У меня была очень похожая проблема, которую я решил на днях. В моем случае я хотел разрешить пользователям выбирать свой собственный пароль, а затем активировать свою учетную запись по электронной почте. В этом много всего, поэтому я просто расскажу, как я добился проверки электронной почты.
Сначала я использовал user_register
(запускается при регистрации пользователя) и создал ключ (например, хэшировал время, адрес электронной почты пользователя и случайную строку и т. Д.) И сохранил этот ключ в таблице usermeta. Это будет удалено, когда пользователь активирует их учетную запись.
Чтобы запретить неактивированному пользователю входить в систему, я добавил дополнительные проверки для входа в систему, используя крючок authenticate
. Например:
Редактировать
Согласно комментариям, authenticate
фильтр должен возвращать объект WP_Error
при сбое, в противном случае возвращайте значение null. wp_authenticate_username_password
запускается после этой функции, и если передается объект WP_User
, он не выполняет никаких проверок подлинности и предполагает, что они были выполнены.
В отредактированный код возвращает все, что было передано ему, или объект WP_Error
, если ключ активации существует (т.е. пользователь еще не активировал свою учетную запись).
add_filter( 'authenticate', 'wpse32218_check_for_key', 10, 3 );
function wpse32218_check_for_key( $user, $username, $password ){
$user_obj = get_user_by('login', $username );
if ($username!=''){
$value = get_user_meta($user->ID, 'confirmed', true);
if($value!=null){
$user = new WP_Error( 'denied', __("<strong>ERROR</strong>: You need to activate your account.".$value."") );//create an error
remove_action('authenticate', 'wp_authenticate_username_password', 20); //key found - don't proceed!
}
}
return $user;
}
(вы можете использовать shake_error_codes
, чтобы заставить окно входа трястись, если ключ найден, если хотите: D).
Затем в вашем подключаемом модуле вам нужно будет переопределить wp_new_user_notification
( которая является подключаемой функцией, присутствующей в /wp_includes/pluggable.php
). Эта функция отправляет электронное письмо новому пользователю и администратору.
Скопируйте функцию в свой плагин, внутри
if ( !function_exists('wp_new_user_notification') ) :
//Define your wp_new_user_notification function here
endif;
А затем адаптируйте его, чтобы он извлекал и включал ключ активации в сообщение пользователю.
Для проекта, над которым я работал, я сделал ссылку из ключа активации, по которой пользователь мог нажать, чтобы активировать свою учетную запись. Например, если их ключ был 01234ABCDE: http://www.example.com?confirm=01234ABCDE.
Используя фильтр query_vars, я зарегистрировал переменную "подтвердить" в WordPress. Затем с помощью фильтра template_include
, всякий раз, когда это установлена переменная (например, как указано выше) Я перенаправляю пользователя на confirm.php
(файл шаблона, находящийся в моем каталоге тем).
Этот шаблон пытается получить пользователя с соответствующим ключом. Если он их найдет, то удалит ключ. Теперь они активированы и могут войти в систему. Если это не так, отображается сообщение об ошибке (ключ не существует или учетная запись активирована). Если есть несколько пользователей с одним и тем же ключом активации (их не должно быть!), он также выдает ошибку.