在标题输出之前进行重定向

时间:2014-02-03 作者:cj5

任何人都知道如何欺骗WordPress进行标题位置重定向。我必须检查用户是否登录,如果没有,则将他们重定向到我们的组织授权系统,该系统是一个外部站点。

我在header()调用之前从WordPress输出排队的脚本中获得输出。

Warning: Cannot modify header information - headers already sent by (output started at /.../wp-includes/class.wp-scripts.php:128) in ...
我有一个插件,它有一个类处理程序,用这个方法处理这个问题:

...
public function populateInfo($form) {
    $email = $this->hasEmail($form);
    /*$name = $this->hasName($form);
    $address = $this->hasAddress($form);
    $phone = $this->hasPhone($form);*/

    // let\'s get some auth info
    if($email !== false || $name !== false || $address !== false || $phone !== false) {
        $ldap = new LDAP();
        $webAuth = new Auth();
        $curPage = \'http://\' . $_SERVER[\'HTTP_HOST\'] . $_SERVER[\'REQUEST_URI\'];
        $webAuth->url = $curPage;
        if($webAuth->isLoggedIn()) {
            $ldap->search($webAuth->getID());

            // set up form variables
            $form[\'fields\'][$email[\'key\']][\'defaultValue\'] = $ldap->getEmail();
        } else {
            // this is where redirect fails
            wp_redirect($webAuth->login_url);
            return;
        }
    }

    return $form;
}
...
更新:此方法通过GravityForms过滤器调用:

add_filter(\'gform_pre_render\', array($this, \'populateInfo\'));
基本上是将信息加载到页面表单中。用户必须登录,才能填充此表单(因此$webAuth->isLoggedIn() 检查)。很明显,我知道标题是预先输出的,我的问题是,如何在WordPress中正确解决这个问题,以便我可以将未经授权的用户重定向到登录,而不被前面的标题所包围?

4 个回复
SO网友:s_ha_dum

调用您的方法太晚。我不知道您如何调用此方法,但您需要运行它before 输出被发送到浏览器——通常这意味着get_header(). 有许多挂钩可以使用。例如(来自https://wordpress.stackexchange.com/a/131210/21376):

add_action(
  \'template_redirect\',
  function() {
    if (is_single()) {
      wp_safe_redirect(home_url());
      exit;
    }
  }
);
如果没有更多的上下文,就不可能确切地说出正确的钩子是什么。

SO网友:Tomas Buteler

我对重力形式一无所知,但很难相信没有更早的钩子可以用来放置重定向逻辑。这可能会迫使您更改一些代码、深入研究源代码等,但这实际上是您的一个逻辑问题。

话虽如此,我个人建议您不要使用一种变通方法,但在您有更多时间研究该问题之前,它可能会起作用。这称为输出缓冲:基本上,您要求PHP保持输出,直到您告诉它“释放”它——也就是说,在您用尽所有可能的重定向之后。It has many caveats, 所以请注意。

你可以在你的主题functions.php:

add_action(\'init\', \'my_prefix_start_buffer\');
function my_prefix_start_buffer() {
    ob_start();
}

add_action(\'wp_footer\', \'my_prefix_flush_buffer\');
function my_prefix_flush_buffer() {
    ob_end_flush();
}
我想gform_pre_render 在之后触发init 和之前wp_footer, 但你可能需要做出相应的调整。

如果有更多的信息,我们可能会给你一个更好的答案。

SO网友:David

您最可能遇到的主要问题是在WP加载过程中没有足够快地调用您的函数。这取决于您用来调用函数的动作挂钩。请参见WordPress Action reference 以获得适当的订单。

关于代码的另一条注释,您应该调用exit; 而不是return; 之后wp_redirect(); 根据WordPress Codex

编辑:为了澄清操作参考资料,您提供的关于何时、何地以及如何调用您的函数的上下文越多,每个人都可以得到越多的帮助!

SO网友:Ashraf Slamang

正确使用的挂钩是template_redirect 这样,您就可以获得进行检查所需的信息,同时也可以提前进行实际重定向。根据codex页面上的示例:

function my_page_template_redirect()
    {
    if( is_page( \'goodies\' ) && ! is_user_logged_in() )
    {
        wp_redirect( home_url( \'/signup/\' ) );
        exit();
    }
}
add_action( \'template_redirect\', \'my_page_template_redirect\' );
此处为Codex页-template_redirect

结束

相关推荐

当尝试向我的登录页面添加一个css文件时,会出现“Headers Always Sent”?

我看过的每一篇关于这个主题的教程都已经过时了,所以我希望这里的人能帮助我。我想为我的wp登录设置样式。带有CSS文件的php页面。但我想以一种在Wordpress更新时不会被覆盖的方式来做。据我所知,根据我读到的图茨,在我的主题函数中使用函数添加它的最佳方式。php文件。不幸的是,人们建议使用的代码并不适合我。这是我添加的代码。<?php function custom_login() { echo \'<link rel=\"stylesheet\" href=\"wplog