Проверка электронной почты для новых пользователей


Я хотел бы реализовать плагин, который требует, чтобы новые пользователи отвечали на электронное письмо, подтверждали свой адрес электронной почты при регистрации. Я уже провожу обширные исследования кодекса, но я очень новичок и был бы признателен за некоторые советы, особенно в отношении того, чтобы пользователь оставался неактивным до тех пор, пока он не подтвердит свою электронную почту. С остальным, думаю, я справлюсь сам.

Author: ProfK, 2011-10-27

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 (файл шаблона, находящийся в моем каталоге тем).

Этот шаблон пытается получить пользователя с соответствующим ключом. Если он их найдет, то удалит ключ. Теперь они активированы и могут войти в систему. Если это не так, отображается сообщение об ошибке (ключ не существует или учетная запись активирована). Если есть несколько пользователей с одним и тем же ключом активации (их не должно быть!), он также выдает ошибку.

 12
Author: Stephen Harris, 2012-08-10 09:52:21