是否在登录后将用户重定向到原始URL?

时间:2011-04-30 作者:Javier Villanueva

我有一个功能,可以将用户重定向到登录页面(主页),如果他们试图访问任何其他页面而没有登录,则其工作原理如下:

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后端一样。

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

7 个回复
最合适的回答,由SO网友:Javier Villanueva 整理而成

谢谢大家,我使用了大家推荐的一些代码,所以最后我的代码如下所示:

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让我知道wp\\u login\\u表单的存在,我不知道它的存在),我在用户凭据正常且他们准备登录时添加了以下内容:

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;
}
非常感谢你的帮助,我把所有人都投了赞成票!

SO网友:Ashfame

你可以很容易做到。您只需要指定一个重定向参数。如果您使用主页上的登录链接转到登录页面,那么@sisir的解决方案是正确的。

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

如果您在frontpage上使用自定义表单,则在<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 );
?>
根据您拥有或需要更改其他参数。

SO网友:Chip Bennett

试着传球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;, 我已经在我的第二个例子中添加了它。

SO网友:Sisir

这是我的代码,我使用人们直接指向wp登录页面。然后登录后,他们返回到原来的位置。但它不是主页,而是wordpress登录页,我在这里设置自定义登录。

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>
你可能想研究一下。通常,您将通过以下方式获取用户的当前url$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

SO网友:user90810

我知道这已经太迟了,但我发了一篇帖子,告诉大家如果将来有人发现并需要它,该怎么做:

http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/

SO网友:Matt

这个login_redirect filter hook 这是一个更完整、更有效的解决方案。这样,您可以为不同级别的用户提供不同的重定向路径,或者在登录时出错(即密码不正确)时维护重定向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 );

SO网友:Neil

你的任何答案都不起作用,只是增加了一点,它起作用了!这里是我的代码:

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的回答相比,但对我来说是关键。希望有帮助!:)

**编辑:

当您强制wordpress在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://. 我还改变了"".

我以this page.

结束

相关推荐

高级集成-WordPress+YOURLS

我一直在使用自定义YOURLS 系统为我的博客网络创建我自己的URL缩写器。一切都很好,只有少数例外(bug已经报告给开发人员)。但我的目标是实现现有WordPress YOURLS插件中未包含的更复杂的功能。目前,当发布帖子时,WordPress会自动登录到您的LS,创建一个简短的URL,并将通知推送到Twitter。它运行良好,可以为我跟踪所有内容(短URL由WordPress记忆并插入适当的<meta> 标签)。我想做的是,我把我的博客帖子安排在太平洋时间上午8点。如果你早上8点在推特上