所有带前端用户注册功能的 WordPress 主题中都会遇到这样一个使用场景:用户填写用户名及密码等信息注册成功后,都希望同时能自动登录。那么,怎么实现这个自动登录呢?本文为你分享2个自动登录的方法,大家可以自由使用。
方法一:利用 Wp_signon() 函数来实现
Wp_signon() 函数描述:根据给定的凭证来验证用户身份。
Wp_signon() 函数用法:
- <?php wp_signon( $credentials, $secure_cookie ); ?>
Wp_signon() 函数参数:
- $Credentials:(数组)(选填)用户的登录信息,默认值:无。注意:如果不填写该项的话,该函数会默认使用 $_POST 变量的值(键名为”log”, “pwd” 和 “rememberme”);
- $Secure_cookie:(布尔)(选填)是否使用安全cookie,默认值:无。
- 返回值:(对象)成功的话返回 WP_User,失败的话返回 WP_Error。
Wp_signon() 函数举例:
将以下代码应用到你的 WordPress 中即可实现自动登录功能:
- if (!is_user_logged_in()) {
- $creds = array();
- $creds[‘user_login’] = ‘example’; // 用户名是example,自行修改
- $creds[‘user_password’] = ‘plaintextpw’; // 密码是plaintextpw
- $creds[‘remember’] = true;
- if ( isset($_SERVER[‘HTTPS’]) && $_SERVER[‘HTTPS’] === ‘on’ ) { // 判断站点是否启用SSL
- $user = wp_signon( $creds, true );
- }else{
- $user = wp_signon( $creds, false );
- }
- if ( is_wp_error($user) )
- echo $user->get_error_message();
- }
方法二:无需密码的方式
通过上面的介绍我们可以看出 wp_signon() 函数是需要知道用户的用户名及密码的,而现在有种更好的实现方法,不需要知道帐号密码,只需指定用户名即可,实现代码如下:
- if (!is_user_logged_in()) {
- $user_login = ‘example’; // 用户名是example,自行修改
- // 获取用户id
- $user = get_userdatabylogin($user_login);
- $user_id = $user->ID;
- // 登录
- wp_set_current_user($user_id, $user_login);
- if ( isset($_SERVER[‘HTTPS’]) && $_SERVER[‘HTTPS’] === ‘on’ ) { // 判断站点是否启用SSL
- wp_set_auth_cookie($user_id,true,true);
- }else{
- wp_set_auth_cookie($user_id);
- }
- do_action(‘wp_login’, $user_login);
- }
特别说明
1、如果将方法一或方法二的代码示例,直接放到主题的 functions.php中,那么只要打开前台任何页面,就会自动登录到你设置的用户名 example 下。本文只是提供自动登录的方法,至于怎么使用就得看你具体的需求了。
2、请注意代码中加了这个判断:判断站点是否启用 SSL,这个是非常重要的!龙笑天下在启用 SSL 的时候,就因为没有启用这个判断,导致出现了一个奇怪且无解(找遍了网络都没找到真正的解决方法… 都在说什么 cookie 的路径问题….)的现象,现将该现象描述如下以供遇到同样问题的你来参考:
通过搜索,使用了网上的几乎所有方法,都无果… 只能确认是 cookie的问题~
后来通过比较a和b两种情形的 cookie 发现了问题所在,唯一区别就是:a情形里 cookie 名是:wordpress_396e26512564256ed830cb7909cc751e,b情形里 cookie 名是:wordpress_sec_396e26512564256ed830cb7909cc751e。大家应该发现问题了吧,cookie 名唯一区别就是 sec。最后通过定位主题的登录函数,发现了是这个 wp_signon() 函数的问题。此外,还有一个“可疑”函数:wp_set_auth_cookie() 这个函数的用法跟 wp_signon() 函数类似:wp_set_auth_cookie( $user_id, $remember, $secure ),第一个参数是用户ID,第二个是是否记住用户,第三个是是否启用安全 cookie~