可以使用自定义帖子类型和自定义字段(ACF)进行登录吗?

时间:2016-05-10 08:45:12

标签: php wordpress

是否可以使用WordPress自定义帖子类型和高级自定义字段创建登录系统?

我创建了一个名为'Users'的自定义帖子类型,我有这种结构:

  • 帖子标题
  • 用户电子邮件(使用ACF的文本类型字段)
  • 用户密码(使用ACF的密码类型字段)

在这些帮助下,我实际上按照自己的意愿自行注册用户。

我的问题在于数据库的结构在哪里保存,因为我认为我无法从正面登录表单登录用户。

我尝试了一些查询,但似乎有些不对劲。有人可以帮助我吗?我是否走在正确的轨道上?

$login_email = $_POST['login_email'];
$login_password = $_POST['login_password'];

$email_sql = $wpdb->get_var($wpdb->prepare("SELECT meta_value FROM ".$wpdb->postmeta." WHERE meta_key = %s AND meta_value = %s",'user_email', $login_email));

$pass_sql = $wpdb->get_results($wpdb->prepare("SELECT meta_value FROM ".$wpdb->postmeta." WHERE meta_key = %s AND meta_value = %s",'user_password', $login_password));

问题是用户电子邮件和用户密码都是meta_key,它们不是同一个记录,我想我不能基于此进行登录。我是对还是有办法?

1 个答案:

答案 0 :(得分:2)

您可以在Wordpress中进行元查询以查询自定义字段。

$user = new WP_Query(array(
    'posts_per_page' => 1,
    'meta_query' => array(
        'relation' => 'and',
        array(
            'key' => 'username',
            'value' => $_POST['username'],
            'compare' => '='
        ),
        array(
            'key' => 'password',
            'value' => $_POST['password'],
            'compare' => '='
        )
    )
));

如果usernamepassword自定义字段与提供的值匹配,则上述内容将返回单个帖子。

注意:上面的代码只是举例。您需要正确处理密码散列以保护代码等。

编辑:与@Anonymous聊天后,事实证明这有点复杂,但最终解决方案是:

$login_email = $_POST['email'];
// Hash the plain text password.
$login_password = wp_hash_password($_POST['password']);

// Find a post with the ACF Custom value that matches our username.
$user_query = new WP_Query(array( 
    'posts_per_page' => 1, 
    'post_type' => 'users', 
    'meta_query' => array( 
        'relation' => 'or', 
        array( 
            'key' => 'email_user', 
            'value' => $login_email, 
            'compare' => '=' 
        ) 
    ) 
)); 
// Check if the user exists.
if ($user_query->have_posts()) { 
    while($user_query->have_posts()){
        // Load the current post.
        $user_query->the_post(); 
        // Get the current post.
        $user = get_post();
        // Get the hashed password from the post.
        $hashed_password = get_post_meta($user->ID, 'password', true); 
        // Compare the hashed passwords.
        if (wp_check_password(wp_hash_password($login_password), $hashed_password)) { 
            echo "logged in successfull"; 
        } else { 
            echo "user found, password incorrect"; 
        }
    }
}