针对新用户的电子邮件验证

时间:2011-10-27 作者:ProfK

我想实现一个插件,要求新用户在注册时回复电子邮件,验证他们的电子邮件地址。我已经在做大量的codex研究,但我是一个新手,希望得到一些提示,尤其是在用户验证其电子邮件之前,保持其非活动状态。其余的我想我会自己处理。

1 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

我有一个非常相似的问题,前几天我解决了。在我的例子中,我希望允许用户选择自己的密码,然后通过电子邮件激活他们的帐户。这方面有很多内容,因此我将简要介绍如何实现电子邮件验证。

首先,我使用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 (位于我的主题目录中的模板文件)。

此模板尝试使用相应的键检索用户。如果找到它们,它将删除密钥。它们现在已激活并可以登录。如果不存在,则显示错误消息(密钥不存在或帐户已激活)。如果有多个用户具有相同的激活密钥(不应该!)它还抛出了一个错误。

结束

相关推荐