对于开放注册的WordPress站点,用户登录后的页面跳转(重定向)是需要好好考虑的。之前分享过《WordPress 登录/登出(注销)后返回之前访问的页面》,今天要说的是将首次登录或者在指定时间内登录的用户,重定向到指定页面。以下代码都可以添加到主题的 functions.php
自动登录并重定向
注册后自动登录并且重定向到指定页面,其实也是实现首次登录重定向的最简便的方法。
/**
* 用户注册成功后自动登录,并跳转到指定页面
* https://www.wpdaxue.com/user-first-login-redirect.html
*/
function auto_login_new_user( $user_id ) {
// 用户注册后自动登录
wp_set_current_user($user_id);
wp_set_auth_cookie($user_id);
// 这里跳转到 http://域名/about 页面,请根据自己的需要修改
wp_redirect( home_url().'about' );
exit;
}
add_action( 'user_register', 'auto_login_new_user');
一定时间内登录重定向
注册后的一定时间内,不管是第几次登录,都跳转到指定页面
/**
* 注册一定时间内登录重定向到指定页面
* https://www.wpdaxue.com/user-first-login-redirect.html
*/
function time_limit_login_redirect( $to, $requested, $user ){
if( !isset( $user->user_login ) ){
return $to;
}
$regtime = strtotime($user->user_registered);
$now = strtotime("now");
$diff = $now - $regtime;
$hours = $diff / 60 / 60;
if( $hours < 48 ){ // 注册后48小时内登录重定向到该页面
return "/about";
} else {
return admin_url(); //WP管理后台
}
}
add_filter('login_redirect', 'time_limit_login_redirect', 10, 3);
一定时间内首次登录重定向(Cookie 版)
使用Cookie记录登录次数,如果在一定时间内登录,且登录次数小于指定次数,就重定向到指定页面
/**
* 注册后一定时间内首次登录重定向(Cookie 版)
* https://www.wpdaxue.com/user-first-login-redirect.html
*/
function redirectOnFirstLogin( $redirect_to, $requested_redirect_to, $user )
{
// 重定向的页面地址
$redirect_url = 'http://yoursite.com/firstloginpage';
// 重定向的次数
$num_redirects = 1;
// 通过 Cookie 记录登录次数
// 指定注册后多久时间内登录(防止用户清空 Cookie 后重复重定向)
// 172800 秒 = 48 小时
$message_period = 172800;
// If they're on the login page, don't do anything
if( !isset( $user->user_login ) )
{
return $redirect_to;
}
// 用来保存登录记录的 Cookie 键名
$key_name = 'redirect_on_first_login_' . $user->ID;
if( strtotime( $user->user_registered ) > ( time() - $message_period )
&& ( !isset( $_COOKIE[$key_name] ) || intval( $_COOKIE[$key_name] ) < $num_redirects )
)
{
if( isset( $_COOKIE[$key_name] ) )
{
$num_redirects = intval( $_COOKIE[$key_name] ) + 1;
}
setcookie( $key_name, $num_redirects, time() + $message_period, COOKIEPATH, COOKIE_DOMAIN );
return $redirect_url;
}
else
{
return $redirect_to;
}
}
add_filter( 'login_redirect', 'redirectOnFirstLogin', 10, 3 );
一定时间内首次登录重定向(字段 版)
使用自定义字段来保存登录次数,如果用户注册时间小于指定时间(比如 48小时),且字段的数值小于指定次数,就重定向
/**
* 注册后一定时间内首次登录重定向(字段 版)
* https://www.wpdaxue.com/user-first-login-redirect.html
*/
function redirectOnFirstLogin( $redirect_to, $requested_redirect_to, $user )
{
// 重定向的页面
$redirect_url = 'http://yoursite.com/firstloginpage';
// 重定向的次数
$num_redirects = 1;
// If implementing this on an existing site, this is here so that existing users don't suddenly get the "first login" treatment
// On a new site, you might remove this setting and the associated check
// Alternative approach: run a script to assign the "already redirected" property to all existing users
// Alternative approach: use a date-based check so that all registered users before a certain date are ignored
// 172800 秒 = 48 小时(用来排除那些老用户)
$message_period = 172800;
// If they're on the login page, don't do anything
if( !isset( $user->user_login ) )
{
return $redirect_to;
}
//添加一个字段来记录登录次数
$key_name = 'redirect_on_first_login';
$current_redirect_value = get_user_meta( $user->ID, $key_name, true );
if( strtotime( $user->user_registered ) > ( time() - $message_period )
&& ( '' == $current_redirect_value || intval( $current_redirect_value ) < $num_redirects )
)
{
if( '' != $current_redirect_value )
{
$num_redirects = intval( $current_redirect_value ) + 1;
}
update_user_meta( $user->ID, $key_name, $num_redirects );
return $redirect_url;
}
else
{
return $redirect_to;
}
}
add_filter( 'login_redirect', 'redirectOnFirstLogin', 10, 3 );
参考资料:
http://wordpress.stackexchange.com/questions/24164/
http://www.theblog.ca/wordpress-redirect-first-login
可以在评论里面设置一项“未回复”吗,不然都不知道哪些没有回复评论。
尝试着找了一下,没找到可用的插件和代码
每个方法都试过了,但是一粘贴打开网站就一片空白,连后台也进不去。要去FTP那里把主题删了才能通过wp-login.php登陆后台。可否有解决方法?
如果你使用了记事本等 不适合编辑代码的编辑器编辑的php文件,那出现你的这个空白问题就是非常常见的了,建议你看看
http://www.wpdaxue.com/wordpress-functions-php.html
收不到邮件,求解决
你需要确保你的主机是否支持发送邮件,
如果你购买的虚拟主机,请联系主机商咨询这个问题
如果是VPS,找人搭建的环境,请联系搭建环境的人
第一个方法,会导致新用户收不到注册邮件,怎么解决
我也是一样,注册邮件不发送
第一段代码 10行 about 应改为 /about 其他亲测可用