是否可以使用WordPress自定义帖子类型和高级自定义字段创建登录系统?
我创建了一个名为'Users'的自定义帖子类型,我有这种结构:
在这些帮助下,我实际上按照自己的意愿自行注册用户。
我的问题在于数据库的结构在哪里保存,因为我认为我无法从正面登录表单登录用户。
我尝试了一些查询,但似乎有些不对劲。有人可以帮助我吗?我是否走在正确的轨道上?
$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,它们不是同一个记录,我想我不能基于此进行登录。我是对还是有办法?
答案 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' => '='
)
)
));
如果username
和password
自定义字段与提供的值匹配,则上述内容将返回单个帖子。
注意:上面的代码只是举例。您需要正确处理密码散列以保护代码等。
编辑:与@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";
}
}
}