只有在任何插件被激活时,wp-admin上才会出现“无法修改标题信息-标题已发送”错误

时间:2017-02-20 作者:Mike Eng

我有这个问题this question 并试图找出问题的来源,但我现在更困惑了。

我正在尝试从当前的WordPress 4.5.5升级我的网站,但首先,我想解决由主题和插件引起的任何错误。

在wp配置中。php中,我将WP\\u DEBUG和WP\\u DEBUG\\u LOG设置为true。

我停用了所有插件并激活了215主题。

在这些情况下,我只在wp admin页面上收到以下错误,而不是在前端:

PHP Warning:  An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>. (WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.) in /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php on line 306
此外,似乎当我激活任何一个插件时(在我尝试的前三个插件中发生,一次一个),我也会遇到一些其他错误,包括:

PHP Warning:  Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php:306) in /Applications/MAMP/htdocs/site-url.com/wp-includes/pluggable.php on line 1167
我在以下每个插件中都遇到了这个错误,每个插件都是单独激活的,其中有215个主题处于活动状态:

AFC FLV Player AFC插件系统Akismet(看起来是一个非常安全的插件)每个插件都是最新版本。

这里有一个detailed log file 注意我所做的事情和每一步的错误。

这似乎是一种奇怪的行为,我在激活任何插件时都会出现“Headers ready sent”错误,似乎无论是哪个插件。

解决此错误的下一步步骤是什么?我发现调试消息缺乏特定性,正如我所理解的那样,它说问题出在函数中。php,它实际上大部分时间是由其他原因引起的。

1 个回复
最合适的回答,由SO网友:Fayaz 整理而成

错误诊断:

The first Error:

PHP Warning:  An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>. (WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.) in /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php on line 306
这基本上是WordPress尝试连接到api.wordpress.org 用于检查核心、插件、主题或翻译相关更新。即使禁用自动更新,WordPress也会进行这些检查,因为手动更新也需要更新检查。

The second Error:

PHP Warning:  Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php:306) in /Applications/MAMP/htdocs/site-url.com/wp-includes/pluggable.php on line 1167
这很可能是WordPress生成HTTP头之前发送到输出的第一个错误(或其他错误)的结果。事实上,如果您输出任何内容(使用print, echo 在发送HTTP头之前,您将看到headers already sent 错误

Other Errors:

我在你的debug.log dump是一些使用不推荐的WordPress函数调用的插件。如果这些插件有一个更新的版本,这些错误在更新后不会持续存在,因此它们并不严重。

更好的错误管理:

调试时,最好只将这些错误发送到debug.log 使用中的以下命令将错误显示到浏览器并禁用显示错误wp-config.php:

define(\'WP_DEBUG\', true);
define(\'WP_DEBUG_LOG\', true);
define(\'WP_DEBUG_DISPLAY\', false);
当设置了上述设置时,WordPress将只在中打印错误,而不是将错误打印到输出缓冲区(即浏览器debug.log 文件位于wp-content 目录(如果web服务器可写入)。这样做的好处是:

debug.log 文件,而不是在浏览器中。

向浏览器输出的错误会破坏网站的html。

通过记录错误onlydebug.log 文件,您还可以避免headers already sent 全部出错。

停止WordPress更新检查:即使您采用上述调试方法,WordPress仍会在您的debug.log 文件那很烦人,因为它会填满的debug.log 快速归档(&F);在中开发时,确实不需要不断检查更新localhost (尤其是脱机时)。

幸运的是,您可以使用pre_http_request 过滤器挂钩。在主题中使用以下代码functions.php 文件,甚至更好,在自定义插件中,并使用它在脱机或在中开发时停止WordPress更新检查localhost:

add_filter( \'pre_http_request\', \'wp_update_check_short_circuit\', 20, 3 );
function wp_update_check_short_circuit( $preempt = false, $args, $url ) {
    if ( stripos( $url, \'https://\') === 0 ) {
        $url = substr( $url, 8 );
    }
    else {
        $url = substr( $url, 7 );
    }

    // stop other URL(s) requests as well (if you need to) in the same manner
    if ( stripos( $url, \'api.wordpress.org\') === 0 ) {
        // WP is trying to get some info, short circuit it with a dummy response
        return array(
            \'headers\'   => null,
            \'body\'      => \'\',
            \'response\'  => array(
                \'code\'      => 503,
                \'message\'   => \'SERVICE_UNAVAILABLE\'
                ),
            \'cookies\'   => array(),
            \'filename\'  => \'\'
            );
    }
    // returning false will let the normal procedure continue
    return false;
}
在此之后,WordPress将不再生成任何与更新检查相关的错误,因为此代码基本上会短路发送到的HTTP请求api.wordpress.org 使用WordPress HTTP API。如果还需要短路其他内部HTTP请求,只需修改上述代码即可。

Note:将更改上载到live server时,请记住关闭此代码。为了确保不会意外停止live server中的更新检查,最好在自定义插件中使用上述代码。这样,只有在中开发时才能启用插件localhost.

相关推荐

Repeated headers in wp_mail

由于标记原因,我多次将自定义标头传递给wp_mail(), 但实际上只有头的最后一个实例被发送。看来wp_mail() 正在筛选自定义标头,以便只发送唯一的标头。我相信这是因为wp_mail 函数定义(wp includes/pluggable.php,第173行)自定义头通过添加到关联数组(第303行)进行处理: $headers[trim( $name )] = trim( $content ); 有没有一种方法可以在不修改wp_mail 功能本身?WP Codex for wp_mai