如何在登录后将WordPress用户重定向到上一页

时间:2017-11-25 12:32:14

标签: wordpress redirect login

我有一个WordPress网站,任何人都可以查看部分/大部分页面(未登录)。但是,用户可以请求拥有自己的私人页面,因此我设置了一个只能由该特定人员访问的页面,然后通过电子邮件将URL发送给他们。他们点击电子邮件中的URL,并通过登录链接发送他们的页面。登录成功后,我希望用户返回他们的私人页面,但目前他们只是在他们的个人资料页面上。

如何在登录后将用户重定向到其私人页面?

我已经尝试了很多不同的代码,但没有一个适用于这种情况。

我目前的代码如下。但这只是将用户发送回登录页面(即使登录成功)。

// Function to redirect after login
add_filter('login_redirect', 'redirect_previous_page', 10, 1);

function redirect_previous_page( $redirect_to ){
    global $user;

    $request = $_SERVER["HTTP_REFERER"];

    if ( in_array( $user->roles[0], array( 'administrator') ) ) {

        return admin_url();

    } elseif ( in_array( $user->roles[0], array( 'subscriber') ) ) {

        return $request;
    } 

    return $redirect_to;
}

3 个答案:

答案 0 :(得分:1)

如果您使用主页上的登录链接转到登录页面,请使用以下代码,

echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] );

如果您在首页上使用自定义表单,那么请确保使用要重定向的网址填写隐藏字段

<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />

如果您使用wp_login_form()生成表单,请按照以下代码,有关详情,请查看此页面wp_login_form

$args = array(
        'echo' => true,
        'redirect' => site_url( $_SERVER['REQUEST_URI'] ), 
        'form_id' => 'loginform',
        'label_username' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in' => __( 'Log In' ),
        'id_username' => 'user_login',
        'id_password' => 'user_pass',
        'id_remember' => 'rememberme',
        'id_submit' => 'wp-submit',
        'remember' => true,
        'value_username' => NULL,
        'value_remember' => false );

wp_login_form( $args );

答案 1 :(得分:0)

如您所知,您要将用户重定向到的页面可以明确地执行此操作,而不是获取HTTP_REFERER。使用in_array()函数检查用户的角色也更可靠。

试试这个:(您需要添加自己的逻辑来获取用户的私人页面,该示例假定每个用户页面的网址为yoursite.com/user/john)

function redirect_previous_page( $redirect_to, $request, $user  ) {
    if ( is_wp_error( $user ) ) { return $redirect_to; }

    if ( is_array( $user->roles ) && in_array( 'administrator', $user->roles ) ) {
        return admin_url();
    } else if ( is_array( $user->roles ) && in_array( 'subscriber', $user->roles ) ) {
        return site_url() . '/users/' . $user->user_login;  // Add your logic here      
    } else {
        return $redirect_to;        
    }
}
add_filter( 'login_redirect', 'redirect_previous_page', 10, 3 );

这是一个更深入地介绍它的教程。 https://tommcfarlin.com/redirect-non-admin/

另一个完全讨论此问题的stackoverflow线程:Redirect after Login on Wordpress

答案 2 :(得分:0)

到目前为止,我发现的最佳代码如下(尽管我有一个很大的缺陷):

// Function to redirect after login (best so far)
function redirect_after_login(){
  global $wp;
  $protocol='http';
  if (isset($_SERVER['HTTPS']))
    if (strtoupper($_SERVER['HTTPS'])=='ON')
      $protocol='https';
  if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
    $redirect = home_url() . "/wp/wp-login.php?redirect_to= $protocol://" . 
$_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'redirect_after_login', 3 );

当我点击电子邮件中的链接时,此代码非常有用 - 在这种情况下,我会转到登录屏幕,然后转到我最初在电子邮件中点击的页面网址。最大的问题是任何非主页也会将我重定向到登录屏幕。这意味着我的休闲读者无法访问我的网站,除了家庭。

当然,这不应该那么难。