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方法

  1. $l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, ‘UTF-8’ );
  2. 修改成:
  3. $str = $l10n[$key];
  4. $str_replace = html_entity_decode( (string) $value, ENT_QUOTES, ‘UTF-8’ );
  5. 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博客

发表评论

您的电子邮箱地址不会被公开。