插件在激活期间生成了 X 个字符的意外输出(WordPress)

Posted

技术标签:

【中文标题】插件在激活期间生成了 X 个字符的意外输出(WordPress)【英文标题】:The plugin generated X characters of unexpected output during activation (WordPress) 【发布时间】:2011-05-03 17:37:21 【问题描述】:

每次激活插件时都会收到此消息:

插件在激活期间生成了 80 个字符的意外输出。如果您发现“标头已发送”消息、联合提要问题或其他问题,请尝试停用或删除此插件。

我能够抑制该消息的唯一方法是将我的激活函数代码包装在 if 语句中(请参阅下面的 sn-ps)。

这里,当我收到上述错误时,我的插件代码的 sn-p:

function myPlugin( $post ) 
    echo "Whatever is here throws an unexpected output alert when the plugin isa activated";

register_activation_hook( __FILE__, 'myPlugin' );

接下来,我将函数包装在 if 语句中的插件中;它抑制了上面讨论的先前错误:

function myPlugin( $post ) 
    global $pagenow;
    if ( is_admin() && $pagenow !== 'plugins.php' ) 
        echo "No more alerts when its wrapped this way";
        
    

register_activation_hook( __FILE__, 'myPlugin' );

究竟是什么导致了这个错误,我怎样才能有效地用我的逻辑完成我的插件而不必遇到它?

有没有更好的方法来处理这个问题?

【问题讨论】:

禁用错误报告,即define('WP_DEBUG', false); 是的。完美,对吧?你看不到的东西会让你不热吗? @manik-thakur 【参考方案1】:

2个可能的原因:

1) 您在错误的位置进行输出(如echo 或等)。

您想在admin 仪表板中输出消息吗? - 使用 admin_notices 钩子并在那里输出...

要在前端输出消息吗? - 用钩子找到合适的地方(如the_contentwp_footer 或其他)。

不要在 register_activation_hook 或 WordPress 标准挂钩之外输出任何内容,没有人应该这样做。**

2) 如果你不是故意做任何输出,那么可能会发生一些php 错误?如果是这样,请将这段代码暂时放在functions.php 中,然后激活插件 - 你会看到错误。

define('temp_file', ABSPATH.'/_temp_out.txt' );

add_action("activated_plugin", "activation_handler1");
function activation_handler1()
    $cont = ob_get_contents();
    if(!empty($cont)) file_put_contents(temp_file, $cont );


add_action( "pre_current_active_plugins", "pre_output1" );
function pre_output1($action)
    if(is_admin() && file_exists(temp_file))
    
        $cont= file_get_contents(temp_file);
        if(!empty($cont))
        
            echo '<div class="error"> Error Message:' . $cont . '</div>';
            @unlink(temp_file);
        
    

【讨论】:

【参考方案2】:

有同样的错误,但只有 6 个字符) 所以...在我的情况下,我在 PHP 结束标记之后有空行?> - 这也会导致此错误。

【讨论】:

是的,这导致了我在这里发布文章的问题innovedesigns.com/wordpress/… 我在文件末尾有这个?&gt; ?&gt; 在我的例子中,我在开始的php标签&lt;?php之前留了一个行空格。因此,当我将其删除时,我得到了 2 个与字符相关的错误。【参考方案3】:

我认为这里可能有两个问题导致了问题。首先,我认为当插件激活钩子被调用时,wordpress 不会期望任何输出,因此它可能会抱怨这一点。其次,插件激活钩子在 wordpress 程序流程中很早就被调用,因此,它可能在发送标头之前被调用。如果在调用header() 之前生成了任何输出,那么 PHP 通常会报错。

通常,插件激活例程保留用于插件的基本设置,调用set_option() 等。

【讨论】:

对我来说很有意义。我已将我的 echo 语句移到另一个位置并解决了警报。【参考方案4】:

我遇到了同样的错误 - 3 个字符的意外输出,在这里被引导。对于我的场景中的人来说,此消息的另一个原因可能是文件类型被编码为带有 BOM 的 UTF。

BOM 编码导致错误,并且在激活插件时,它会因此在 Internet Explorer 中不正确地呈现。

解决方法是使用 Notepad++ 并选择“Convert to UTF without BOM”,或者如果你使用的是visual studio,有一个关于如何更改编码的说明UTF-8 without BOM

【讨论】:

【参考方案5】:

我与这个问题斗争了很长时间。通常这是由开始 &lt;?php 标记之前或结束 ?&gt; 标记之后的空格或换行引起的。一旦我删除了这些,错误就消失了。

此外,永远不要假设任何关于 GETPOSTCOOKIEREQUEST 变量的内容。始终使用isset()empty() 进行检查。

【讨论】:

谢谢!我在开头 我在没有 isset 检查的情况下使用 $_GET。为你答案的最后一行竖起大拇指! 你需要像这样开始 PHP &lt;?php 987654329@这个开始标签上没有空格【参考方案6】:

在我的情况下,这是由于未定义的索引,只需启用调试日志以检查导致它的原因,然后您就可以轻松解决它。

对于那些不知道如何启用调试日志的人,在你的 wp-config.php 中添加这些行:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_DISPLAY', true );
    define( 'WP_DEBUG_LOG', true );

你可以在 wp-content 中创建的调试文件中正确看到错误

【讨论】:

【参考方案7】:

有时是因为您不需要使用&lt;?php ;?&gt; 或如下所示使用它

;?>

<?php

结束标签和起始标签之间的额外行也可能导致此错误,只需删除该行/空格

【讨论】:

【参考方案8】:

分配 register_activation_hook 的常用方法是使用类的静态方法。这样可以确保您的插件激活函数名称不会与其他插件冲突。

class Foo_Plugin 

    public static function plugin_activation() 
        // activation logic
    

这个函数需要是公共的而不是私有的。但是很容易犯错误,因此当您遇到此类错误时,这可能是您遇到问题的原因。

然后您将在主插件文件中使用此代码注册激活。

register_activation_hook( __FILE__, array( 'Foo_Plugin', 'plugin_activation' ) );

【讨论】:

【参考方案9】:

错误消息The plugin generated *X* characters of unexpected output during activation 不是很有帮助,或者至少还不够。

为了帮助定位问题,请将这些添加到wp-config.php

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );

然后查看wp-content/debug.log 以获取有关错误来源的更详细的错误消息。

【讨论】:

【参考方案10】:

我遇到了同样的问题。我注意到文件开头有新行。所以我删除了它们,错误消失了。尝试删除文件开头的新行。这可能会有所帮助。

【讨论】:

我在一个包含的 PHP 文件中有一个空白行——这也导致了这个问题。【参考方案11】:

对于初学者级别的开发人员,它必须在 "?>" 关闭 php 标签后为空换行符。 在此之后尝试删除所有空换行符。

【讨论】:

【参考方案12】:

这个问题可以通过删除多余的空格来解决。我为我的代码解决了这个问题。您可以在 Adove Dreamweaver 中轻松删除多余的空格。

首先,转到编辑-> 查找和替换。或按 Ctrl+F。选中“选项”部分的“使用正则表达式”按钮。

用以下代码填写“查找”字段

[\r\n]2,

用以下代码填写“替换”字段

\n

现在点击“全部替换”按钮。 希望它会工作。

【讨论】:

【参考方案13】:

我遇到了同样的问题,我试图删除代码并做了所有事情但仍然是同样的问题

对我来说真正的解决方案如下。

    在包含插件标题的文件末尾,我删除了关闭 php?> 问题将得到解决 在包含插件标题的插件文件末尾删除关闭php后多余的换行符?>

我的插件文件在第 69 行结束,在最后一个 php 代码之后还有 7 个空格,所以在编辑器中文件最多为 66,我的错误是“插件生成了 7 个意外字符......”当我删除了最多 69 行的多余行,错误消失了,

谢谢

【讨论】:

【参考方案14】:

查看here 以查看您可以使用的更多信息:

<?php
     include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); 
            If (is_plugin_active('wshops/init.php'))
             
               //Run your plugin includes files or functions
            

在你的初始化 php 文件中。

【讨论】:

-因为这种方式会检查插件是否在加载之前被激活,包括文件或任何其他功能,这样可以防止出现错误,以防万一你没有空字符,php之前的行标签或文本编码问题对我来说工作正常,因为有时会在插件完全激活之前发送标头。【参考方案15】:

我在激活插件时也遇到了这个问题

插件在激活过程中产生了 1 个字符的意外输出。如果您发现“标头已发送”消息、联合提要问题或其他问题,请尝试停用或删除此插件。

这通常是由开始标记前的空格或换行引起的。一旦我删除了这些,错误就消失了。

现在我的插件错误消失了。

【讨论】:

【参考方案16】:

我的问题是在主 php 文件中,我在文件末尾附加了一个 javascript 函数。似乎 wordpress 在 head 元素中挂钩了这样的功能。我将该函数外部化为一个 java 脚本文件。

之前:

<?php
/**
* Plugin Name: yyy
* Description: yyy
* Author: yyy
* Author URI: yyy
* Version: yyy
*/

/* many functions here */


function insert_in_header() 
    echo '<script type="text/javascript">',
    "perform_redirection(", '"', get_option('root'), '"', ", ", '"', get_option('redirect_to'), '");',
    '</script>';

add_action('wp_head', 'insert_in_header');
?>
<--! PROBLEMS HERE-->
<script type = "text/javascript">
    function perform_redirections(root, redirectionLink) 
      // code here
    
</script>

之后:

<?php
/**
* Plugin Name: yyy
* Description: yyy
* Author: yyy
* Author URI: yyy
* Version: yyy
*/

/* many functions here */

function insert_in_header() 
    // in headscripts.js i put the perform_redirection function 
    echo '<script type="text/javascript" src="', plugins_url('js/headscripts.js', __FILE__ ), '">  </script>';
    echo '<script type="text/javascript">',
    "perform_redirection(", '"', get_option('root'), '"', ", ", '"', get_option('redirect_to'), '");',
    '</script>';

add_action('wp_head', 'insert_in_header');
?>

【讨论】:

【参考方案17】:

对我来说,有一些错误在调试过程中被吞并而没有被捕获

如果在这里找到这篇文章,它解释了如何确定这个 output 实际上是什么

$unexpectedOutput= ob_get_contents();

现在你有了它,你可以在调试过程中回显它或检查它以找出到底出了什么问题,对我来说这是一个数据库脚本的问题。

感谢下面的文章

https://www.toddlahman.com/the-plugin-generated-x-characters-of-unexpected-output-during-activation/

【讨论】:

【参考方案18】:

只需将您在激活挂钩上调用的函数设为静态

【讨论】:

【参考方案19】:

在记事本中打开 PHP 文件并使用 ANSI 编码保存它对我来说是诀窍。即使我稍后在 Visual Studio Code 中打开并保存它也不会导致问题再次发生。

感谢Todd

【讨论】:

【参考方案20】:

在尝试了每个答案但仍然不足时,我发现我的问题与这里的所有答案都不同。

基本上,意外字符来自我在 MAMP 服务器上的错误日志。即使在 php.ini 中有 WP_DEBUGWP_DEBUG_DISPLAYdisplay_errors = On,这些错误也不会显示在前端或 Wordpress 安装错误日志中

我最终知道这是一个错误导致了 umm 错误,所以我深入挖掘并在位于 MAMP/logs/php/php_error.logphp_error.log 中发现了一些错误

修复了错误,来自 wordpress 的消息在激活时消失了。

【讨论】:

【参考方案21】:

我也遇到了同样的问题,只是把私有函数改成静态就解决了。

private function db_setup()  ....

static function db_setup()  ....

我希望这会有所帮助...

【讨论】:

【参考方案22】:

在我的情况下,我在开始 &lt;?php 标记之前添加了额外的空格,但这是一个有线错误

【讨论】:

【参考方案23】:

插件意外输出错误的第一眼检查清单。

    删除插件所有php文件中的关闭php标签?&gt;。 删除php标签&lt;?php前的空格 避免在函数/挂钩中回显内容,否则在需要时清理缓冲区。

【讨论】:

以上是关于插件在激活期间生成了 X 个字符的意外输出(WordPress)的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress 239 字符意外输出错误

我无法在 localhost 上激活我的 WordPress 插件

无法激活插件,因为它触发了致命错误:意外的“require_once”

if语句C ++期间意外中断

打印存储为字符串的十六进制值会产生意外的输出

005-做题:使用 Python 生成 200 个激活码