首页 文章

我想在wordpress中使用用户名,电子邮件ID和电话号码登录

提问于
浏览
1

我想使用用户名,电子邮件ID和电话号码登录wordpress . 我在用户注册时在User meta中插入电话号码的位置 . 是否有任何钩子我可以访问用户meta并使用密码验证它以进行登录 . https://wordpress.org/plugins/wp-email-login/
我发现这个插件在登录时用于用户名和电子邮件ID验证 . 所以,我可以使用用户名和电子邮件ID登录,但我的主要问题是用户元表中的电话号码 .

2 回答

  • 4

    试试这个:

    我们需要做的第一件事是删除默认的身份验证权限 . 将以下代码段添加到functions.php文件中:

    //remove wordpress authentication
    remove_filter('authenticate', 'wp_authenticate_username_password', 20);
    

    接下来,我们将添加自己的身份验证 . 为此,我们将使用add_filter .

    将以下代码添加到functions.php文件中:

    add_filter('authenticate', function($user, $email, $password){
    
        //We shall SQL escape all inputs
        $user_phone = $wpdb->escape($_REQUEST['user_phone']);
        $password   = $wpdb->escape($_REQUEST['password']);
    
        //Check for empty fields
            if(empty($user_phone) || empty ($password)){        
                //create new error object and add errors to it.
                $error = new WP_Error();
    
                if(empty($user_phone)){ //No email
                    $error->add('empty_phone', __('<strong>ERROR</strong>: Phone field is empty.'));
                }
                if(empty($password)){ //No password
                    $error->add('empty_password', __('<strong>ERROR</strong>: Password field is empty.'));
                }
    
                return $error;
            }
    
            //Check if user exists in WordPress database
            //$user = get_user_by('email', $email);
            //Instead of the above one use this 
            $user = reset(
                         get_users(
                          array(
                           'meta_key' => 'user_phone',
                           'meta_value' => $user_phone,
                           'number' => 1,
                           'count_total' => false
                          )
                         )
                        );
    
            //bad email
            if(!$user){
                $error = new WP_Error();
                $error->add('invalid', __('<strong>ERROR</strong>: Either the phone or password you entered is invalid.'));
                return $error;
            }
            else{ //check password
                if(!wp_check_password($password, $user->user_pass, $user->ID)){ //bad password
                    $error = new WP_Error();
                    $error->add('invalid', __('<strong>ERROR</strong>: Either the phone or password you entered is invalid.'));
                    return $error;
                }else{
                    return $user; //passed
                }
            }
    }, 20, 3);
    

    这次表格应该是:

    当然,如果你想要一个输入字段,那么就可以完成 . 但是您需要决定如何选择要执行的验证,电子邮件地址或用户名

    <form id="login" name="form" action="<?php echo home_url(); ?>/login/" method="post">
            <input id="user_phone" type="text" placeholder="Phone Number" name="user_phone">
            <input id="password" type="password" placeholder="Password" name="password">
            <input id="submit" type="submit" name="submit" value="Submit">
    </form>
    
  • 1

    这不是首选解决方案,因为我们需要创建自定义登录表单来实现此目的

    您需要在前端创建一个模板,如下所示:

    <form id="login" name="form" action="<?php echo home_url(); ?>/login/" method="post">
            <input id="username" type="text" placeholder="Username" name="username">
            <input id="user_phone" type="text" placeholder="Phone Number" name="user_phone">
            <input id="password" type="password" placeholder="Password" name="password">
            <input id="submit" type="submit" name="submit" value="Submit">
    </form>
    

    在上面写这个PHP代码将在表单上工作

    我通过用户名获取用户的用户ID,然后通过用户ID在user_meta表中获取用户电话,然后将其与提交的用户电话号码进行匹配 .

    您可以在下面的代码中进行更改,以单独验证电话号码 .

    I have assumed the meta_key and input type name both as "user_phone"

    if($_POST) {
    
        global $wpdb;
    
        //We shall SQL escape all inputs
        $user_phone = $wpdb->escape($_REQUEST['user_phone']);
        $username   = $wpdb->escape($_REQUEST['username']);
        $password   = $wpdb->escape($_REQUEST['password']);
        $remember   = $wpdb->escape($_REQUEST['rememberme']);
    
        $user = get_userdatabylogin($username);
    
    
        if($remember) $remember = "true";
        else $remember = "false";
    
        $login_data = array();
        $login_data['user_login'] = $username;
        $login_data['user_password'] = $password;
        $login_data['remember'] = $remember;
    
        //get user phone number from DB
        $org_phone = get_user_meta($user->ID , 'user_phone',1);
    
        $user_verify = wp_signon( $login_data, false ); 
    
        if ( is_wp_error($user_verify) && $org_phone == $user_phone) 
        {
           header("Location: " . home_url() . "/login/error/");
           // Note, I have created a page called "Error" that is a child of the login page to handle errors. This can be anything, but it seemed a good way to me to handle errors.
         } else {    
           echo "<script type='text/javascript'>window.location='". home_url() ."'</script>";
           exit();
         }
    
    } else {
    
        // No login details entered - you should probably add some more user feedback here, but this does the bare minimum
    
        echo "Invalid login details";
    
    }
    

相关问题