您收到的警告是,一旦您已将当前页面的内容发送到另一个页面,就无法将浏览器重定向到该页面。
错误的其余部分告诉您发送您还不想要的内容的确切文件。您需要:
确保在有机会输出此内容之前,在较早的挂钩中运行重定向;或者修复导致此内容输出的任何原因,以便重定向将按预期运行。在您的情况下,输出来自wp-login.php 当它输出实际的登录表单时。这意味着您必须在发生这种情况之前加入。
我可以看到你在这里做了什么,这是一个常见的错误:你找到了login_head 本函数前面提到的操作(在wp-login.php), 并试图勾住它。问题是,代码add_action( \'login_head\', \'wp_no_robots\' ); 你在这里看到的实际上是login_head 它本身它没有运行操作。
进一步研究wp-login.php, 在这个函数中,我们发现do_action( \'login_head\' ); 在第98行附近(注意do_action 而不是add_action). This 是指钩住的代码实际运行的时间,不幸的是在Wordpress发送的输出之后(登录页面的开始)。
所以,我们需要找到一个更早的钩子。因为我们正在重定向,所以我们真的应该尽早进行,否则我们可能会让Wordpress做很多工作,只需要在重定向到的页面上重新进行。查看Action Reference 在法典上,init 是一个很早的钩子,听起来可能满足我们的需要。
杰出的尝试修改挂钩函数以使用init 而不是login_head.
BUT, 我们还需要采取一个步骤。。。否则,我们将在每个页面上重定向每个用户!
在您的函数中,您现在还需要检查正在查看的是登录页面。不幸的是,Wordpress没有提供is_login_page() 函数,因此我们可以使用检查全局pagenow 变量:
if($GLOBALS["pagenow"] == "wp-login.php"){ /* do redirect here */ }
综上所述,您现在应该能够成功地从登录页面重定向出去(虽然我还没有测试所有这些!):
function e4_login_form_disable() {
if ( $GLOBALS[\'pagenow\'] == \'wp-login.php\' ){
if ( ! isset( $_GET[\'gandalf\'] ) || $_GET[\'gandalf\'] != \'thewhite\' ) {
wp_redirect( home_url() );
exit;
}
}
}
add_action(\'init\', \'e4_login_form_disable\');
关于输出缓冲,是的,这在技术上是可行的,但它肯定是有漏洞的,当有替代品时,你不应该使用它。它也会稍微减慢每个重定向。