2015-04-19 15 views
1

我正在尝试创建订阅者自动登录的功能,并附加到网站URL上。我使用ACF将密钥文本添加到用户详细信息页面,密钥存储在_usermeta表中。我可以自动登录。但是,当我访问登录页面之外的页面时,基于$ current_user对象的回显,登录名似乎更改为我的登录名。WP使用查询字符串键自动登录

为了测试,我使用了一个注销的Safari浏览器(我从不使用)。在查询字符串中使用具有特殊键的URL登录用户,并在我回显这些值时显示正确的用户名和ID。

查询字符串看起来像:

http://website.com/?k=ABCD1234

这里是我的代码:

function auto_login() { 
 

 
\t $user_key = $_GET['k']; 
 

 
\t global $wpdb; 
 
\t $user_id = $wpdb->get_var(" SELECT user_id FROM wp_usermeta WHERE meta_value = '".$user_key."' "); 
 

 
\t wp_set_current_user($user_id); 
 
\t wp_set_auth_cookie($user_id); 
 

 
\t global $current_user; 
 
\t $user = ""; 
 
\t get_currentuserinfo(); 
 
\t $user = $current_user->user_login; 
 
\t //echo $user; 
 
} 
 
add_action('init', 'auto_login');

感觉就像cookie不会被置位(数据/状态没有跨页面维护)。有什么想法发生在这里?谢谢!

+0

查看pluggable.php时,似乎可能与$ current_user发生冲突,因为wp_set_current_user也会使用它。但是,当我将全局$ current_user行删除到// echo $ user行时,我仍然得到相同的行为:我可以使用包含查询字符串k = value的URL回显正确的用户标识,但单击第二页开关即使我没有登录,我也删除了与此域名相关的所有Cookie。 – FredHead

回答

2

请尝试改用plugins_loaded操作。如果用户已经登录,功能wp_set_current_user也会失败,因此您应该检查该功能。如果没有找到,$wpdb->get_var再次与验证返回null。为了安全起见,你应该逃避SQL,特别是在处理登录时,这个语句可以很容易地被操纵。

function auto_login() { 
    if (is_user_logged_in()) 
     return; 

    $user_key = $_GET['k']; 

    global $wpdb; 
    $user_id = $wpdb->get_var($wpdb->prepare("SELECT user_id FROM wp_usermeta WHERE meta_value = %s", $user_key)); 

    if (isset($user_id)) { 
     wp_set_current_user($user_id); 
     wp_set_auth_cookie($user_id); 

     global $current_user; 
     $user = ""; 
     get_currentuserinfo(); 
     $user = $current_user->user_login; 
     //echo $user; 
    } 
} 

add_action('plugins_loaded', 'auto_login'); 
+0

是的,我没有添加任何像登录检查,直到我的代码工作。你肯定$ wpdb->准备是需要选择查询吗?文档只显示更新和插入。 欣赏plugins_loaded动作的想法。但是,它不会回显测试值。而且它没有解决我登录信息超出wp_set_current_user和wp_set_auth_cookie设置的问题。事实上,cookie功能似乎不起作用。但是,由于WP或Safari浏览器和Chrome浏览器中的某些内容,即使我注销,退出浏览器也不清楚。 – FredHead

+1

再次感谢您的帮助。我能够找到另一台机器,并通过我的网络浏览器证明我的计算机存在这个问题。欣赏plugins_loaded操作的想法以及一些包装代码,以便在调用代码时进行优化。 – FredHead

0

如果有帮助,这里是我想出的代码。剩下的唯一问题是cookie方法似乎设置了浏览会话的时间限制,这对我来说不是问题。我将不得不调查如何延长cookie时间。否则,也许这个代码是给别人做同样的事情有用:

function auto_login() { 
 

 
\t if (is_user_logged_in()) { 
 
\t \t return; 
 
\t } else { 
 

 
\t \t if ($_GET['k']) { 
 

 
\t \t \t $user_key = $_GET['k']; 
 

 
\t \t \t global $wpdb; 
 
\t \t \t $sql = $wpdb->prepare(" SELECT user_id FROM wp_usermeta WHERE meta_value = %s ", $_GET['k']); 
 
\t \t \t $user_id = $wpdb->get_var($sql); 
 

 
\t \t \t if ($user_id) { 
 
\t \t \t \t wp_set_current_user($user_id); 
 
\t \t \t \t wp_set_auth_cookie($user_id); 
 
\t \t \t } else { 
 
\t \t \t \t //alert stripe div with message/email link 
 
\t \t \t } 
 

 
\t \t \t //only used for testing code above 
 
\t \t \t if ($_GET['k']) { 
 
\t \t \t \t echo $user_id; 
 
\t \t \t \t echo $sql; 
 
\t \t \t \t if (is_wp_error($user)) 
 
\t \t \t \t \t echo $user->get_error_message(); 
 
\t \t \t } 
 
\t \t } 
 

 
\t } 
 
} 
 
add_action('init', 'auto_login');

还要注意,每ub3rst4r上面,你可以使用之前的初始化动作plugins_loaded行动。最后,我使用ACF插件为用户创建一个文本字段,以存储存储在_usermeta表中的唯一用户密钥值。