Sakurairo主题编辑文章报错“更新失败, 此响应不是合法的 JSON 响应”

Zou, Ning 发布于 2025-12-23 站点文章 911 字 86 次阅读


编辑文章报错

事情经过是这样的,因为某种原因我重新部署了wordpress并使用了Sakurairo主题,于是遇到了如标题所示的BUG”更新失败, 此响应不是合法的 JSON 响应“。具体故障现象为:文章更新报错、文章更新缓慢(转圈圈)、站点主页界面全白。

环境(LNMP):

  • Linux:Linux VM-8-9-opencloudos 6.6.92-34.1.oc9.x86_64
  • Nginx版本:1.28.0
  • Mysql版本:10.6.20-MariaDB
  • PHP版本:8.3.22

代码问题查找与分析

通过使用排除法分析问题根源,流程如下:禁用全部插件(故障依旧)、查看站点与WordPress的URL设置(故障依旧),切换主题(故障解决)。于是问题出现在主题上,但是问题来了。主题文件非常多怎么定位问题呢?“区块编辑器”只会报错:更新失败, 此响应不是合法的 JSON 响应。没有任何错误提示,而通过切换编辑器为“经典编辑器”发现,报错的详情信息和具体位置反馈出来了:

[错误截图] PHP致命错误:调用 number_format() 函数时参数类型错误,应为整数或浮点数但提供了字符串。错误位于 /wp-content/themes/Sakurairo/functions.php 文件的第764行。下方附有完整的堆栈跟踪信息。

具体问题在function.php文件的第764行,这个错误是由于number_format() 函数接收到了字符串类型的参数,而它要求第一个参数必须是整数或浮点数。

  • 数据类型不匹配number_format()函数期望接收整数或浮点数作为第一个参数,但实际传递的是字符串类型。这在PHP 8.0及以上版本中会触发TypeError异常,而在早期版本可能只会产生警告。
  • 代码调用链:错误发生在 restyle_text()函数中,该函数被 get_post_views()调用,最终在文章保存过程中触发。

修复代码

源代码中的问题是number_format()接受了非数值类型的函数,$number参数被直接传递给了 number_format()函数。根据PHP的严格类型检查,当 $number是一个字符串(比如从数据库或元数据中获取的包含非数字字符的值)时,就会触发这个TypeError异常:

function restyle_text($number)
{
switch (iro_opt('statistics_format')) {
case "type_2": //23,333 次访问
return number_format($number);
case "type_3": //23 333 次访问
return number_format($number, 0, '.', ' ');
case "type_4": //23k 次访问
if ($number >= 1000) {
return round($number / 1000, 2) . 'k';
}
return $number;
default:
return $number;
}
}

腾讯元宝给出修复之后的代码如下:

function restyle_text($number)
{
// 安全处理输入:清理并转换为数值
$clean_number = 0;
if (is_numeric($number)) {
$clean_number = (float)$number;
} elseif (is_string($number)) {
// 移除可能干扰的字符(逗号、空格、货币符号等)
$clean_number = (float) preg_replace('/[^\d.]/', '', $number);
}
switch (iro_opt('statistics_format')) {
    case "type_2": //23,333 次访问
        return number_format($clean_number);
    case "type_3": //23 333 次访问
        return number_format($clean_number, 0, '.', ' ');
    case "type_4": //23k 次访问
        if ($clean_number >= 1000) {
            return round($clean_number / 1000, 2) . 'k';
        }
        return $clean_number;
    default:
        return $clean_number;
}
}

问题解决&新问题

通过修改代码,页面已经可以正常显示。

但是带来了一个新的问题,站点主页非常卡。具体表现为:拖动不跟鼠标、GPU占用变高。这种现象电脑配置有关,如果是轻薄本或是核显那么问题现象会严重,如果是独显高性能的台式机则不明显。此外,如果主页只有一个文章或是没有文章则几乎没有这个现象,文章数量>=2就会卡顿。关掉页面之后GPU占用从70%平均值降低到40%,推测可能与Edge开启GPU加速有关?