【问题标题】:The plugin generated X characters of unexpected output during activation (WordPress)插件在激活期间生成了 X 个字符的意外输出(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

标签: php wordpress


【解决方案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】:

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

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

                  1. 在包含插件标题的文件末尾,我删除了关闭 php?> 问题将得到解决
                  2. 在包含插件标题的插件文件末尾删除关闭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】:

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

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

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2016-05-09
                                      • 2011-12-05
                                      • 1970-01-01
                                      • 2014-08-11
                                      • 1970-01-01
                                      • 2016-07-29
                                      • 2020-05-26
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多