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

时间:2010-11-02 02:17:39

标签: php wordpress

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

  

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

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

这里是我收到上述错误时的插件代码片段:

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' );

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

有没有更好的方法来解决这个问题?

23 个答案:

答案 0 :(得分:21)

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);
        }
    }
}

答案 1 :(得分:15)

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

答案 2 :(得分:14)

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

BOM编码导致错误,而插件已激活,因此会在Internet Explorer中呈现错误。

解决方案是使用Notepad ++并选择“转换为无BOM的UTF”,或者如果您使用的是visual studio,则说明如何更改编码UTF-8 without BOM

答案 3 :(得分:14)

我认为这里可能存在两个导致问题的问题。首先,我不认为wordpress在调用插件激活挂钩时需要任何输出,所以它可能会抱怨。其次是在wordpress程序流中很早就调用了插件激活挂钩,因此,它可能在发送标头之前被调用。如果在调用header()之前生成了任何输出,那么PHP通常会抱怨。

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

答案 4 :(得分:6)

我和这个问题打了很长时间。通常,这是由打开<?php标记之前或结束?>标记之前的空格或换行引起的。一旦我删除了这些,错误就消失了。

此外,永远不要假设GETPOSTCOOKIEREQUEST个变量。请务必先使用isset()empty()进行检查。

答案 5 :(得分:3)

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

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

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

您可以在wp-content

中创建的调试文件中正确查看错误

答案 6 :(得分:2)

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

class Foo_Plugin 
{
    public static function plugin_activation() {
        // activation logic
    }
}

此功能需要公开而非私密。但是很容易出错,所以这可能是你在遇到这种错误时出现问题的原因。

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

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

答案 7 :(得分:2)

对于初学者来说,开发人员必须在php标记“?>”关闭后使用空换行符。 然后尝试删除所有空的换行符。

答案 8 :(得分:1)

有时这是因为您使用<?php ;?>不必要或使用它如下所示

;?>

<?php

关闭和开始标记之间的这一额外行也可能导致此错误,简单地删除该行/空格

答案 9 :(得分:1)

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

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

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

[\r\n]{2,}

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

\n

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

答案 10 :(得分:1)

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

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

  1. 在包含插件标题的文件末尾我删除了关闭php?&gt;并且问题将得到解决
  2. 在包含插件标题的插件文件的末尾,删除关闭php后的额外换行符?&gt;
  3. 我的插件文件在第69行结束,并且在最后一个php代码之后有7个间隔,因此在编辑器中文件最多为66,我的错误是“插件生成7个字符的意外....”当我删除了多达69行的额外行,错误消失了,

    由于

答案 11 :(得分:1)

错误消息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以获取有关错误来源的更详细错误消息。

答案 12 :(得分:1)

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

答案 13 :(得分:0)

在我的例子中,我在开始 <?php 标签之前添加了额外的空格,虽然这是一个有线错误

答案 14 :(得分:0)

插件意外输出错误的初见清单。

  1. 删除插件的所有php文件中的关闭php标签?>
  2. 去掉php标签<?php前的空格
  3. 避免函数/钩子中的回显内容,否则在需要时清理缓冲区。

答案 15 :(得分:0)

我遇到了同样的问题,我只是将私有函数更改为静态函数并解决了。

private function db_setup() { ....

static function db_setup() { ....

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

答案 16 :(得分:0)

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

基本上,意外字符来自我在 MAMP 服务器上的错误日志。错误未显示在前端或 Wordpress 安装错误日志中,即使 php.ini 中有 MyHtmlHelpersWP_DEBUGWP_DEBUG_DISPLAY

我最终知道这是一个导致 umm 错误的错误,所以我深入挖掘并在位于 display_errors = On

php_error.log 中发现了一些错误

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

答案 17 :(得分:0)

在记事本中打开PHP文件并以ANSI编码保存对我来说是个窍门。即使以后我在Visual Studio Code中打开并将其保存后,它也不会再次发生此问题。

感谢Todd

答案 18 :(得分:0)

只需将激活钩子上要调用的函数设为静态

答案 19 :(得分:0)

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

如果在本文中听到这篇文章,解释了如何确定此false实际上是什么

output

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

enter image description here

信用以下文章

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

答案 20 :(得分:0)

我的问题是在主要的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');
?>

答案 21 :(得分:0)

当我激活我的插件时,我也遇到了这个问题

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

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

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

答案 22 :(得分:0)

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

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

在你的init php文件中。