核心根源(99% 场景)
场景 1:使用 admin-ajax.php 自定义 AJAX 接口(最常见)
WordPress ajax 钩子机制规则:
- 你在钩子函数里输出 JSON 之后没有正确终止程序,函数执行完毕继续走完 WP 底层流程
- 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);
})
三、快速自检步骤
- 接口函数末尾有没有
wp_die()/exit?没有就是元凶 - 优先替换
echo json_encode()→wp_send_json() - 删除所有 PHP 文件末尾
?> - 停用插件逐个排查冲突(缓存、安全插件最容易干扰输出)
正文完
可以使用微信扫码关注公众号(ID:xzluomor)