我正在尝试使用附加到网站网址的唯一键为订阅者创建自动登录功能。我使用ACF将关键文本添加到用户详细信息页面,密钥存储在_usermeta表中。我可以自动登录。但是,当我转到目标网页之外的页面时,登录似乎会根据$ current_user对象的回显更改为我的登录信息。
为了测试,我正在使用已注销的Safari浏览器(我从未使用过)。在查询字符串中使用带有特殊键的URL会记录用户,并在回显这些值时显示正确的用户名和ID。
查询字符串如下所示:
http://website.com/?k=ABCD1234
这是我的代码:
function auto_login() {
$user_key = $_GET['k'];
global $wpdb;
$user_id = $wpdb->get_var( " SELECT user_id FROM wp_usermeta WHERE meta_value = '".$user_key."' ");
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('init', 'auto_login');
感觉就像没有设置cookie(不跨页面维护数据/状态)。知道这里发生了什么吗?谢谢!
答案 0 :(得分: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');
答案 1 :(得分:0)
如果有帮助,这就是我想出的代码。剩下的唯一问题是cookie方法似乎设置了浏览会话的时间限制,这对我来说不是问题。我将不得不研究如何延长cookie时间。否则,也许这个代码对其他人做同样的事情很有用:
function auto_login() {
if ( is_user_logged_in() ) {
return;
} else {
if ( $_GET['k'] ) {
$user_key = $_GET['k'];
global $wpdb;
$sql = $wpdb->prepare( " SELECT user_id FROM wp_usermeta WHERE meta_value = %s ", $_GET['k'] );
$user_id = $wpdb->get_var( $sql );
if ( $user_id ) {
wp_set_current_user($user_id);
wp_set_auth_cookie($user_id);
} else {
//alert stripe div with message/email link
}
//only used for testing code above
if ($_GET['k']) {
echo $user_id;
echo $sql;
if ( is_wp_error($user) )
echo $user->get_error_message();
}
}
}
}
add_action('init', 'auto_login');

另请注意,根据上面的ub3rst4r,您可以使用init操作之前的plugins_loaded操作。最后,我使用ACF插件为用户创建一个文本字段,以存储_usermeta表中存储的唯一用户键值。