You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动