WordPress JSON 末尾多出一个 0 完整原因 + 修复方案

3次阅读
没有评论

核心根源(99% 场景)

场景 1:使用 admin-ajax.php 自定义 AJAX 接口(最常见)

WordPress ajax 钩子机制规则:

  1. 你在钩子函数里输出 JSON 之后没有正确终止程序,函数执行完毕继续走完 WP 底层流程
  2. WP 默认 admin-ajax.php 最后会执行 die('0'); 收尾,代表无后续处理,最终你的 JSON 字符串末尾强制拼接上字符 0 返回结果示例:

json

{"code":1,"data":[]}0

JSON 解析器读到末尾多余字符直接报错:SyntaxError: Unexpected end of JSON input / Extra data after JSON

场景 2:自己写了 return 0; / 函数有数字返回值

自定义接口函数最后返回数字 0,PHP 会把返回值打印到响应流,追加在 JSON 后方。

场景 3:文件 BOM 头、多余空格、插件提前输出内容

functions.php、自定义插件 PHP 文件UTF-8 带 BOM 编码、文件开头 / 结尾空行、echo/print 随意输出内容,打乱输出缓冲区,最终尾部多出 0 或乱码字符

场景 4:误用 json_encode() + 手动 echo,没走 WP 官方函数

原生 echo 输出 json,缓冲异常叠加 WP 退出逻辑追加 0。


一、标准正确写法(彻底杜绝末尾 0)

方式 1:推荐!使用 WP 内置 wp_send_json_*(首选)

WordPress 封装好的函数:自动输出 JSON、设置正确响应头、内部自动调用 wp_die (),不会追加 0

php

运行

// 成功返回
wp_send_json_success( [ 'list' => $data ] );

// 失败返回
wp_send_json_error( [ 'msg' => '请求失败' ] );

// 自定义任意数组
$res = [ 'code' => 200, 'data' => $posts ];
wp_send_json( $res ); // 完美,末尾绝不会多0

方式 2:原生 json_encode + 手动终止(不用 wp_send_json 时)

如果你非要自己 echo 输出,必须输出后立刻终止进程:

php

运行

function my_ajax_api() {
    $data = ['name'=>'test'];
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    
    // 关键:必须exit/wp_die,阻止WP后续执行die('0')
    wp_die(); 
    // 或者 exit;
}
add_action('wp_ajax_my_action', 'my_ajax_api');
add_action('wp_ajax_nopriv_my_action', 'my_ajax_api');

⚠️ 禁止:只 echo json,不加 wp_die() / exit


二、排查其他次要诱因

1. 检查所有 PHP 文件是否存在多余输出

打开:主题functions.php、自定义插件所有 php 文件

  • 文件最开头不能有空格、换行
  • 文件最结尾不能有 ?> 闭合标签(WP 规范:PHP 文件省略末尾?>,杜绝换行空格输出)
  • 全程不要随意写 echo、print、var_dump 调试代码

2. 清理输出缓冲区(兼容老旧环境)

开头清空缓冲区,避免前置输出污染响应:

php

运行

function my_ajax_api() {
    ob_clean(); // 清空缓冲区
    ob_start();
    
    $arr = ['status'=>true];
    wp_send_json($arr);
}

3. 切换 REST API 而非 admin-ajax(全新接口推荐)

自定义 WP REST 路由(wp-json/xxx)天生不会追加 0,更规范:

php

运行

add_action('rest_api_init', function () {
    register_rest_route('myapi/v1', '/demo', [
        'methods' => 'GET',
        'callback' => function(){
            return ['code'=>200]; // 直接return数组,WP自动转JSON,无需手动exit
        }
    ]);
});

访问:你的域名/wp-json/myapi/v1/demo,返回纯净 JSON 无多余字符。

4. 前端临时兼容方案(应急兜底)

来不及改后端时,前端截取去掉末尾 0:

javascript

运行

fetch(url).then(res=>res.text()).then(text=>{
  const jsonStr = text.replace(/0$/, ''); // 剔除末尾数字0
  const data = JSON.parse(jsonStr);
})

三、快速自检步骤

  1. 接口函数末尾有没有 wp_die() /exit?没有就是元凶
  2. 优先替换 echo json_encode()wp_send_json()
  3. 删除所有 PHP 文件末尾 ?>
  4. 停用插件逐个排查冲突(缓存、安全插件最容易干扰输出)
正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码