Login 通过电话号码登录

Login 通过电话号码登录,login,woocommerce,Login,Woocommerce,我正在使用Woocommerce建立一个网站。默认情况下,用户名是用户的电子邮件地址。我想为用户提供通过电话号码登录的功能。我该怎么做?请帮忙 这是一个有趣的问题。有几件事需要考虑: 用户是否已经根据自己的帐户输入了电话号码,或者在购买时提供了电话号码? 我们是否使用计费电话号码登录? 假设这两件事都是真的,您可以连接到authenticate筛选器,搜索具有匹配billing_phone meta的用户,并返回该用户的实际用户名: <?php /// // Allow login v

我正在使用Woocommerce建立一个网站。默认情况下,用户名是用户的电子邮件地址。我想为用户提供通过电话号码登录的功能。我该怎么做?请帮忙

这是一个有趣的问题。有几件事需要考虑:

用户是否已经根据自己的帐户输入了电话号码,或者在购买时提供了电话号码? 我们是否使用计费电话号码登录? 假设这两件事都是真的,您可以连接到authenticate筛选器,搜索具有匹配billing_phone meta的用户,并返回该用户的实际用户名:

<?php

///
//  Allow login via phone number
///

function vnmAdmin_emailLogin($user, $username, $password) {

    //  Try logging in via their billing phone number

    if (is_numeric($username)) {

        //  The passed username is numeric - that's a start

        //  Now let's grab all matching users with the same phone number:

        $matchingUsers = get_users(array(
            'meta_key'     => 'billing_phone',
            'meta_value'   => $username,
            'meta_compare' => 'LIKE'
        ));

        //  Let's save time and assume there's only one. 

        if (is_array($matchingUsers)) {
            $username = $matchingUsers[0]->user_login;
        }

    }

    return wp_authenticate_username_password(null, $username, $password);
}

add_filter('authenticate', 'vnmAdmin_loginWithPhoneNumber', 20, 3);

?>

注意:这种方法不是绝对可靠的;例如,它不会检查“登录”号码或检索到的用户元号码中是否有空格;它只是假设它找到的第一个用户就是正确的用户——如果出于任何原因,您有多个用户使用同一个电话号码,这并不理想。但话虽如此,我已经对它进行了测试,它仍然有效。

函数名与@indextwo answer中add_filter callback中给出的不同。我想使用电子邮件和电话号码进行身份验证。使用@indextwo回答并得出了这个结论

///
//  Allow login via phone number and email
///

function vnmAdmin_loginWithPhoneNumber($user, $username, $password) {

    //  Try logging in via their billing phone number

    if (is_numeric($username)) {

        //  The passed username is numeric - that's a start

        //  Now let's grab all matching users with the same phone number:

        $matchingUsers = get_users(array(
            'meta_key'     => 'billing_phone',
            'meta_value'   => $username,
            'meta_compare' => 'LIKE'
        ));

        //  Let's save time and assume there's only one. 

        if (is_array($matchingUsers) && !empty($matchingUsers)) {
            $username = $matchingUsers[0]->user_login;
        }

    }elseif (is_email($username)) {

        //  The passed username is email- that's a start

        //  Now let's grab all matching users with the same email:

        $matchingUsers = get_user_by_email($username);
        //  Let's save time and assume there's only one. 

        if (isset($matchingUsers->user_login)) {
            $username = $matchingUsers->user_login;

        }

    }

    return wp_authenticate_username_password(null, $username, $password);
}

add_filter('authenticate', 'vnmAdmin_loginWithPhoneNumber', 20, 3);

嘿,付费电话号码是用户注册的必填字段。我想,用户必须能够通过他们的电子邮件或电话注册,其中任何一个都可以是他的用户名。同时我会试试你的代码,然后再给你回复。谢谢-@vkm使用这种技术,他们的用户名仍然是他们的用户名,例如indextwo,假设这是一个标准的用户注册表,但他们可以使用用户名或电话号码登录。如果这回答了你的问题,请考虑接受它: