我有一个非常相似的问题,前几天我解决了。在我的例子中,我希望允许用户选择自己的密码,然后通过电子邮件激活他们的帐户。这方面有很多内容,因此我将简要介绍如何实现电子邮件验证。
首先,我使用user_register
(在用户注册时运行)并创建一个密钥(例如,对时间、用户的电子邮件地址和随机字符串等进行哈希运算),并将该密钥存储在usermeta表中。当用户激活其帐户时,此项将被删除。
为了防止未激活的用户登录,我使用钩子向登录添加了额外的检查authenticate
. 例如:
Edit根据评论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;
然后对其进行调整,以便在发送给用户的消息中检索并包含激活密钥。
对于我正在工作的项目,我从激活密钥创建了一个链接,用户可以单击该链接来激活他们的帐户。E、 g如果他们的钥匙是01234ABCDE:http://www.example.com?confirm=01234ABCDE.
使用filter query\\u vars,我向WordPress注册了变量“confirm”。然后使用template_include
过滤器,无论何时设置该变量(例如如上所述),我都会将用户重定向到confirm.php
(位于我的主题目录中的模板文件)。
此模板尝试使用相应的键检索用户。如果找到它们,它将删除密钥。它们现在已激活并可以登录。如果不存在,则显示错误消息(密钥不存在或帐户已激活)。如果有多个用户具有相同的激活密钥(不应该!)它还抛出了一个错误。