登录后将用户重定向到原始网址?


16

我有一个函数,如果用户试图在不登录的情况下访问任何其他页面,则将用户重定向到登录页面(主页),这是它的工作方式:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

确实很简单并且可以正常工作,问题在于我需要将它们重定向到成功登录后要尝试访问的url,就像WordPress后端的工作原理一样。

有没有办法做到这一点?提前致谢!

Answers:


16

您可以轻松地做到这一点。您只需要指定一个重定向参数。如果您使用主页上的登录链接转到登录页面,则@sisir的解决方案是正确的。

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); ?>

如果您在首页上使用自定义表单,请在内<form>确保使用url填充隐藏字段以进行重定向

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

如果您使用的是 wp_login_form()用于生成表单,请填写参数-http://codex.wordpress.org/Function_Reference/wp_login_form

<?php
$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 );
?>

根据您的需求更改其他参数。


我正在使用自定义表单,并且正在使用您提供的隐藏字段解决方案,但就我而言,我正被重定向到url,例如“ localhost / wordpress / localhost / wordpress / blog / someone”。有什么帮助吗?
拉菲2014年

我有这个,我用双斜杠。所以我的解决方案是这样的<?php echo'//'。$ _SERVER [“ HTTP_HOST”]。$ _SERVER [“ REQUEST_URI”]; ?>
rafi 2014年

6

尝试传递the_permalink()作为$redirect参数:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( the_permalink() );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

编辑:

抱歉,最初误解了您的问题。尝试这个:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        $redirect = home_url() . '/wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] );
        wp_redirect( $redirect );
        exit;
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

另请注意:正确的使用wp_redirect()通常需要添加exit;,我已经在第二个示例中添加了。


这并没有任何意义,重定向需要去家里,这是工作的罚款,我需要一些方法来捕捉原始地址和用户重定向。有一次,他在日志中。
哈维尔·维拉纽瓦

抱歉,最初误解了您的问题。我添加了一个编辑,希望可以解决您的用例。
Chip Bennett

4

谢谢,我有点使用每个人的建议,因此最终我的代码如下所示:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

在我的登录表单上(我正在用@Ashfame对我的登录表单进行硬编码,感谢@Ashfame,让我知道wp_login_form我不知道它存在),我在用户凭据良好并且可以登录时添加了它:

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() does not exit automatically, and should almost always be followed by a call to exit;
    exit;

} else {
    wp_redirect(get_bloginfo('url') . '/groups/');
    exit;
}

非常感谢您的帮助,我投票给所有人!


嗨哈维尔,您在哪个文件中添加了这些功能?谢谢。
泰勒·德登

functions.php
哈维尔·维拉纽瓦

4
您应该致电exit()die()之后wp_redirect()。否则,之后的代码可能wp_redirect()会执行,这可能会导致错误和安全漏洞。
伊恩·邓恩

2

这是我的代码,我用它来指导人们进入wp登录页面。然后,当他们登录时,他们回到了原来的位置。但这不是主页,而是我设置自定义登录的wordpress登录页面。

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>

您可能想研究。通常,您将通过以下方式获取用户的当前网址$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


0

login_redirect过滤器钩在这里更完整和有效的解决方案。这样,您可以为不同级别的用户提供不同的重定向路径,或者在登录时发生错误(即密码错误)的情况下维护重定向URL。

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

0

它没有解决您的任何问题,但仅添加了一点点,就可以了!这是我的代码:

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '/wp-login.php?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]));
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

/wp-login.php与@Matt的回复相比,只有我添加了,但对我而言,这才是关键。希望有帮助!:)

**编辑:

当您强制在HTTPS中导航时,我检测到错误。此方法无效,因为重定向是在HTTP中进行的。为了解决问题,我更改了功能。结果如下:

function restrict_access_if_logged_out(){
  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-login.php?redirect_to= $protocol://" . $_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

我检查了协议,然后删除了' esc_url'并添加了正确的协议:$protocol://。我也改变了""

我基于此页面


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.