插件在激活期间生成了 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_content
或wp_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/… 我在文件末尾有这个?> ?>
在我的例子中,我在开始的php标签<?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】:我与这个问题斗争了很长时间。通常这是由开始 <?php
标记之前或结束 ?>
标记之后的空格或换行引起的。一旦我删除了这些,错误就消失了。
此外,永远不要假设任何关于 GET
、POST
、COOKIE
和 REQUEST
变量的内容。始终使用isset()
或empty()
进行检查。
【讨论】:
谢谢!我在开头 我在没有 isset 检查的情况下使用 $_GET。为你答案的最后一行竖起大拇指! 你需要像这样开始 PHP<?php
987654329@这个开始标签上没有空格【参考方案6】:
在我的情况下,这是由于未定义的索引,只需启用调试日志以检查导致它的原因,然后您就可以轻松解决它。
对于那些不知道如何启用调试日志的人,在你的 wp-config.php 中添加这些行:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', true );
define( 'WP_DEBUG_LOG', true );
你可以在 wp-content 中创建的调试文件中正确看到错误
【讨论】:
【参考方案7】:有时是因为您不需要使用<?php ;?>
或如下所示使用它
;?>
<?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_DEBUG
、WP_DEBUG_DISPLAY
和 display_errors = On
,这些错误也不会显示在前端或 Wordpress 安装错误日志中
我最终知道这是一个错误导致了 umm 错误,所以我深入挖掘并在位于 MAMP/logs/php/php_error.log
的 php_error.log
中发现了一些错误
修复了错误,来自 wordpress 的消息在激活时消失了。
【讨论】:
【参考方案21】:我也遇到了同样的问题,只是把私有函数改成静态就解决了。
private function db_setup() ....
到
static function db_setup() ....
我希望这会有所帮助...
【讨论】:
【参考方案22】:在我的情况下,我在开始 <?php
标记之前添加了额外的空格,但这是一个有线错误
【讨论】:
【参考方案23】:插件意外输出错误的第一眼检查清单。
-
删除插件所有php文件中的关闭php标签
?>
。
删除php标签<?php
前的空格
避免在函数/挂钩中回显内容,否则在需要时清理缓冲区。
【讨论】:
以上是关于插件在激活期间生成了 X 个字符的意外输出(WordPress)的主要内容,如果未能解决你的问题,请参考以下文章
我无法在 localhost 上激活我的 WordPress 插件