每当我安装/更新插件时,都会收到“Warning:CALL_USER_FUNC_ARRAY()”错误

时间:2014-01-07 作者:Angelos Kyritsis

这是在我将wordpress安装从共享主机移到vps后开始的。

完全错误如下:

警告:call\\u user\\u func\\u array()要求参数1为有效回调,数组必须在/home/pcsteps/public\\u html/wp includes/plugin中正好有两个成员。php在线199

我只有在安装或更新插件时才能得到它。它似乎不会以任何方式影响插件的功能。

插件上提到的行。php如下所示:

195     do {
196     foreach( (array) current($wp_filter[$tag]) as $the_ )
197         if ( !is_null($the_[\'function\']) ){
198             $args[1] = $value;
199             $value = call_user_func_array($the_[\'function\'], array_slice($args, 1, (int) $the_[\'accepted_args\']));
200         }
201
202 } while ( next($wp_filter[$tag]) !== false );
我在互联网上到处找了找,但找不到解决办法。

欢迎任何帮助:)

3 个回复
SO网友:kovshenin

这是一个棘手的问题。您实际上不需要查看wp-includes/plugin。php,这个文件没有什么问题,它是一个核心文件,所以你应该像所有其他核心文件一样,不要管它。

它之所以棘手,是因为core中的操作和过滤器需要一个正常工作的回调函数,但当您add_actionadd_filter 它从未真正验证回调。事实上,它在执行时从不验证它do_actionapply_filters 也可以,但它会直接传递给call_user_func_array.

所以,每当您看到这个错误(或者它是非数组姐妹错误)时,它仅仅意味着某个主题或插件在add_actionadd_filter:

add_action( \'init\', \'function_that_does_not_exist\' );
add_action( \'init\', array( \'Class_Name\', \'method_that_does_not_exist\' ) );
add_action( \'init\', array( \'Non_Existent_Class\', \'method\' ) );
add_action( \'init\', array( \'Class_Name\', \'method\', \'huh?\' ) );
add_action( \'init\', array( \'Just a bogus array\' ) );
您的具体错误是案例#4,它将回调作为数组传递,但数组中有2个以上的值,这正是PHP所抱怨的。这是WordPress操作、优先级和参数的常见错误:

add_action( \'foo\', array( $this, \'bar\', 10, 2 ) );
看,这看起来有点像我们foo 与我们bar 具有两个参数的优先级为10的方法。但实际上,我们将传递一个由四个元素组成的数组作为回调函数。这是我们真正想要做的:

add_action( \'foo\', array( $this, \'bar\' ), 10, 2 );
请注意回调是一个2元素数组,20和2是add_action.

希望这能为您的插件带来一些启示。

SO网友:MrJustin

我不确定到底是什么$the_[\'function\'] 是的,但你会因此而出错。

要求参数1为有效回调,数组必须正好有两个成员

这表明$the_[\'function\'] 不是有效的回调,因为它不是两个成员。错误本身说明了问题所在。

这可能不足以获得解决方案。你能再显示一点代码吗?

PS:由于我花费了我的名誉点数,所以我不会对这个问题发表评论

SO网友:wesley Helene

检查您的php版本。。它应该是在php 7.0或更低版本上,但不是在php 7.1上,因为php 7.1版本不稳定,因此会导致很多错误。

谢谢

结束

相关推荐

private functions in plugins

我开发了两个插件,其中一个功能相同(相同的名称,相同的功能)。当试图激活两个插件时,Wordpress会抛出一个错误,因为它不允许我以相同的名称定义函数两次。有没有一种方法可以使这个函数只对插件私有,而不使用面向对象编程,也不简单地重命名函数?我不想使用OOP,因为我首先要学习它。此外,我不想重命名该函数,因为我可能也想在其他插件中使用它,而重命名感觉不太合适。