Node.js调用WordPress admin-ajax.php发POST返回400和0如何配置
问题核心原因
你当前遇到的400+返回0的问题,本质是WordPress原生admin-ajax接口默认不支持JSON格式的请求体,只能读取application/x-www-form-urlencoded类型的表单编码参数,后端识别不到你传的action参数,就会直接返回0和400状态码。
修复步骤
- 更换请求体格式为表单编码格式,不要使用JSON序列化参数
- 补充
Content-Type和Content-Length请求头,让WordPress能正常解析参数 - 如果后端自定义action做了nonce校验,需要额外补充
_wpnonce参数,值可从站点对应页面的源码(隐藏input字段或前端全局JS变量)中获取 - 确认你使用的Cookie为有效登录态Cookie:如果自定义action是仅登录用户可调用的
wp_ajax_{action}钩子,Cookie权限不匹配也会返回0
修复后完整代码示例
const https = require("https"); const qs = require("querystring"); // 引入Node内置querystring模块做表单编码 const data = { action: "create_chapter", postID: "2676", chapterName: "2", chapterContent: "test", // _wpnonce: "你的站点对应nonce值", // 后端有校验时打开这行补充参数 }; // 把参数转为表单编码格式 const postData = qs.stringify(data); const options = { hostname: "www.website.com", path: "/wp-admin/admin-ajax.php", method: "POST", headers: { "Cookie": "替换为你的有效登录Cookie", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/x-www-form-urlencoded", // 必填请求头 "Content-Length": Buffer.byteLength(postData) // 准确设置请求体长度 }, }; const req = https.request(options, (res) => { console.log(`statusCode: ${res.statusCode}`); res.on("data", (d) => { process.stdout.write(d); }); }); req.on("error", (error) => { console.error(error); }); req.write(postData); // 发送表单编码的请求体,不要传JSON req.end();
额外排查点
如果修改后仍返回0:
- 确认后端自定义action钩子注册正确:需要根据调用场景注册
wp_ajax_create_chapter(登录用户调用)和wp_ajax_nopriv_create_chapter(未登录用户调用),回调函数执行完成后必须调用wp_die()结束请求,否则也会默认返回0 - 确认你传的
action参数值和钩子后缀完全一致,大小写敏感
内容的提问来源于stack exchange,提问作者Sezer
相关产品推荐
相关产品推荐

