WP 使用查询字符串键自动登录

WP auto-login with query string key

我正在尝试为订阅者创建使用附加到网站的唯一密钥自动登录的功能 URL。我使用 ACF 将密钥文本添加到用户详细信息页面,密钥存储在 _usermeta table 中。我可以自动登录。但是,当我转到登录页面以外的页面时,根据 $current_user object.

的回显,登录名似乎更改为我的登录名

为了测试,我使用的是已注销的 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(data/state没有跨页面维护)。知道这里发生了什么吗?谢谢!

请尝试使用 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');

如果有帮助,这是我想出的有效代码。剩下的唯一问题是 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 table.

中的唯一用户键值