Login without Password

时间:2020-12-23 作者:Mohammed Khalil

在Wordpress中,我需要添加一个过滤器,其中用户角色订阅者只需在表单中输入其电子邮件地址即可登录,无需密码,只需检查电子邮件是否针对订阅者,并将其重定向到特定页面,我尝试了许多解决方案,但我没有收到,谢谢

2 个回复
最合适的回答,由SO网友:Rup 整理而成

是的,您可以添加authenticate 筛选以处理优先级高于默认wp\\U authenticate\\U email\\U password handler的电子邮件和无密码情况。e、 g.(未测试)

function wpse_380353_authenticate_email_no_password( $user, $email, $password ) {
    if ( is_wp_error( $user ) || ( $user instanceof WP_User ) ) {
        // Already handled by a higher-priority filter
        return $user;
    }

    if ( ! empty( $email ) && is_email( $email ) && empty( $password ) ) {
        // This is an email login with empty password
        $user = get_user_by( \'email\', $email );

        if ( $user && ! is_wp_error( $user ) ) {
            // TODO: Verify that the user is someone you\'d want to login without
            // a password. For now, let\'s reject anyone who can edit posts.
            if ( $user->has_cap( \'edit_posts\' ) ) {
                $error = new WP_Error();
                // TODO: localize the error message
                $error->add( \'empty_password\',
                    \'<strong>Error</strong>: This user requires a password.\' );
                return $error;
            }

            // We\'ll allow this user to login without a password.
            // Return the user object and the calling code will handle the login.
            return $user;
        }
        // else could not fetch the user by email address.
        // You\'ll probably now get a \'password field is empty\' error
        // from a later filter.
        // TODO: If you want a different error then generate it here.
    }

    return $user;
}

// Add an authenticate filter with a higher priority (= lower number) than
// wp_authenticate_email_password which has priority 20.
add_filter( \'authenticate\', \'wpse_380353_authenticate_email_no_password\', 10, 3 );

SO网友:Shazzad

WordPress核心充满了惊喜。你可以用它做很多事情。

要向所需的用户角色提供无密码登录,可以修改WordPress处理用户登录身份验证的方式。有一个名为authenticate, 您可以使用它来连接,并扩展授权过程以启用该功能。

WordPress本身通过3个单独的函数钩住这个回调-

  • wp_authenticate_cookie - 这将验证用户是否已登录
  • wp_authenticate_username_password - 此验证用户名/密码组合wp_authenticate_email_password - 这将验证电子邮件/密码组合
以上功能的优先级为30.您可以在此处挂接具有更高优先级的函数,并检查这些验证是否返回WP_Error 对象对于空密码,错误代码为empty_password. 如果错误和错误代码匹配,您可以执行进一步的验证,以测试是否有使用该登录名/电子邮件的用户,以及他是否是订阅者。

听起来不错吧?这是密码-

function wpse_password_less_login_authentication( $user, $username, $password ) {
    if (! is_wp_error($user) && \'empty_password \' !== $user->get_error_code()) {
        return $user;
    }

    if (strpos($username, \'@\')) {
        $find_user = get_user_by( \'email\', $username );
    } else {
        $find_user = get_user_by( \'login\', $username );
    }

    if ( $find_user && ! is_wp_error( $find_user ) && in_array( \'subscriber\', $find_user->roles, true ) ) {
        return $find_user;
    }
    
    return $user;
}
add_filter( \'authenticate\', \'wpse_password_less_login_authentication\', 40, 3 );
这个功能应该放在你的主题里面functions.php (或包含的文件)或在活动插件文件中。