如何通过Fetch将JavaScript数组传递到WordPress的admin-ajax.php并正确处理?
如何通过Fetch将JavaScript数组传递到WordPress的admin-ajax.php并正确处理?
看起来你遇到的是WordPress自动转义导致JSON解析失败的问题,我来帮你梳理下问题根源和解决办法~
问题根源
你在JS里把数组转成JSON字符串传递,但WordPress会自动对$_POST里的参数添加转义斜杠(比如把双引号变成\"),这就导致你直接用json_decode时,得到的是无效的JSON格式,所以返回null。
方案一:修复JSON传递的方式(适配现有代码)
修改你的PHP函数,先去除WordPress自动添加的转义,再解码JSON:
function process_array_ids(){ if(isset($_POST['my_string_array']) && !empty($_POST['my_string_array'])){ // 第一步:去除WordPress自动添加的转义斜杠 $clean_json = wp_unslash($_POST['my_string_array']); // 第二步:解码JSON为数组,第二个参数true返回关联数组(方便后续处理) $product_ids = json_decode($clean_json, true); // 检查解码是否成功 if(is_array($product_ids)){ // 这里可以做你的业务逻辑,比如检查某个ID是否在数组里 $has_target_id = in_array('123', $product_ids); echo json_encode([ 'success' => true, 'product_ids' => $product_ids, 'has_target' => $has_target_id ]); } else { echo json_encode(['success' => false, 'error' => '无法解析产品ID数组']); } } else { echo json_encode(['success' => false, 'error' => '未接收到产品ID数据']); } wp_die(); }
JS部分不需要改动,不过可以加个调试步骤确认JSON字符串是否正常:
async function fetch_my_array(url, post, myArray){ let myForm = new FormData() let my_string_array = JSON.stringify(myArray) // 调试:看看转成的JSON字符串是否正常 console.log('待传递的JSON:', my_string_array) myForm.append('action', 'my_array_ids_action') myForm.append('my_string_array', my_string_array) const options={ method: post, body: myForm } const response = await fetch(url, options) let result = await response.json() console.log('返回结果:', result) }
方案二:直接传递数组(更简洁,无需JSON转义)
其实FormData支持直接传递数组,不需要先转成JSON,这样PHP端可以直接拿到数组,省去解码步骤:
修改JS的fetch_my_array函数:
async function fetch_my_array(url, post, myArray){ let myForm = new FormData() myForm.append('action', 'my_array_ids_action') // 把数组的每个元素添加为同一个key的数组形式 myArray.forEach(id => { myForm.append('my_string_array[]', id); }) const options={ method: post, body: myForm } const response = await fetch(url, options) let result = await response.json() console.log('返回结果:', result) }
对应的PHP函数可以简化:
function process_array_ids(){ if(isset($_POST['my_string_array']) && is_array($_POST['my_string_array'])){ $product_ids = $_POST['my_string_array']; // 直接处理数组 $has_target_id = in_array('123', $product_ids); echo json_encode([ 'success' => true, 'product_ids' => $product_ids, 'has_target' => $has_target_id ]); } else { echo json_encode(['success' => false, 'error' => '未接收到有效的产品ID数组']); } wp_die(); }
调试小技巧
- 在PHP里可以先执行
var_dump($_POST['my_string_array']); wp_die();,看看接收到的原始数据是什么样的,确认转义情况 - 在浏览器DevTools的Network面板里查看请求的Form Data,确认传递的参数是否正确
备注:内容来源于stack exchange,提问作者Mehdi




