WordPress + PHP 8.0 出现错误的 Required parameter $class follows optional parameter $limit in
PHP Warning
在设置主题的时候出现:
Warning: Only the first byte will be assigned to the string offset in /path/wp-includes/class.wp-scripts.php on line 492
其中一个错误如上所示,这个警告指向的是wp-includes/class.wp-scripts.php文件,这是WordPress的一个核心文件。一开始,我想很多小伙伴会和笔者一样认为是WordPress自己的错误,但是WordPress在5.6版本就已经宣布全面支持PHP 8了,所以这个问题不应该是WordPress核心文件有问题。
要想解决这个问题,我们需要把报错的相关代码拿出来看:
$l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
上述代码,大家肯定和笔者一样看的莫名奇妙,感觉不到什么问题。但是如果结合它所在的function
:
public function localize( $handle, $object_name, $l10n )
大家是不是猜到了,很可能是在使用wp_localize_script
这个function
时出现了问题,而问题的关键就在于参数$l10n
。
我们不妨从官网资料中看一下$l10n
到底是个什么东西:
$l10n (array) (Required) The data itself. The data can be either a single or multi-dimensional array.
原来,问题在于参数$l10n
在函数wp_localize_script
中接受到的应该是一个数组,如果没有接受到数组,只是接受到了字符串等非数组的值时,由于PHP 8的新特性,会报出一个警告。
解决办法
解决这问题其实相对简单,只需要在使用函数wp_localize_script
:
wp_localize_script( string $handle, string $object_name, array $l10n )
把上面参数$l10n
改为数组即可。但是需要注意修改后的使用,比如此函数的作用可为JavaScript提供一个参数,参数名字为$object_name
。在函数修改后,参数$object_name
将在JavaScript中成为一个对象
ps:还有一种解决办法 直接修改class.wp-scripts.php中的localize方法
把
-
$l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, ‘UTF-8’ );
-
-
修改成:
-
-
$str = $l10n[$key];
-
$str_replace = html_entity_decode( (string) $value, ENT_QUOTES, ‘UTF-8’ );
-
substr_replace($str, $str_replace, 0, strlen($str_replace));
PHP Deprecated
Deprecated: Required parameter $xxx follows optional parameter $yyy in…
这类报错在升级PHP 8后也非常常见。这类错误多是来自一些主题或者是插件。其实这类的错误早就存在多年,但是一直未受到太多重视,最终在PHP 8的时候变成了Deprecated报错。
以下是出现错误代码:
function xxxxx( $avatar, $id_or_email, $size=30, $default, $alt )
其实出现的问题很简单,错误的点就在$size=30
这个参数。由于PHP规定,在可选参数中,若有默认值的参数不在最后一个,将会直接忽视它的默认值。所以这样写根本没必要,直接把默认值删除即可:
function xxxxx( $avatar, $id_or_email, $size, $default, $alt )
也许有人会担心是不是会导致一些问题,这大可不必。因为这个问题在PHP 8之前就存在,只是没有报错而已。这次PHP 8特地报了个Deprecated来解决这种不严谨的使用。当然,这也是为什么虽然只是个Deprecated,笔者也拿出来说一说的原因。赶紧把一些历史遗留问题解决了把~
转载laiz:WordPress + PHP 8.0 出现错误的部分解决办法_only the first byte will be assigned to the string-CSDN博客