禁用登录表单并在没有标题的情况下在注销时重定向用户发送php警告

时间:2016-04-24 作者:e4rthdog

我已经创建了自己的登录和注册表单,所以我需要一种方法来禁用标准登录表单。

此外,我还需要在注销时将用户重定向到其他地方,而不是登录表单。

我想出了这个逻辑。已打开wp-login.php 找到了第一个钩子。那是login_head.

所以我连接到这个,我只是重定向,除非用户提供一个秘密令牌。

function e4_login_form_disable() {
        if ( ! isset( $_GET[\'gandalf\'] ) || $_GET[\'gandalf\'] != \'thewhite\' ) {
            wp_redirect( home_url() );
            exit;
        }
    }
我能接受吗,还是我错过了什么?

ADDITIONAL INFO: 我收到以下警告:"Warning: Cannot modify header information - headers already sent by (output started at /public_html/site/wp-login.php:63) in site/wp-includes/pluggable.php on line 1171 "

如果启用output_buffering 在php中。ini并将此文件放置在。创建警告的php文件驻留在其中。

但这似乎是一个“黑客”。。。

1 个回复
SO网友:Tim Malone

您收到的警告是,一旦您已将当前页面的内容发送到另一个页面,就无法将浏览器重定向到该页面。

错误的其余部分告诉您发送您还不想要的内容的确切文件。您需要:

确保在有机会输出此内容之前,在较早的挂钩中运行重定向;或者修复导致此内容输出的任何原因,以便重定向将按预期运行。在您的情况下,输出来自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\');
关于输出缓冲,是的,这在技术上是可行的,但它肯定是有漏洞的,当有替代品时,你不应该使用它。它也会稍微减慢每个重定向。