You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Woocommerce Rest API新增响应字段触发Flutter FormatException如何解决

问题根因

你遇到的JSON解码失败和前端解码逻辑无关,是WordPress后端执行你写的自定义过滤器代码时触发了PHP错误,错误页面的HTML内容被输出到了JSON响应的开头,导致返回内容不符合JSON格式,所以Flutter解析时报错。

故障代码存在的几个问题

  • 过滤器参数不匹配:注册woocommerce_rest_prepare_shop_order_object过滤器时你指定接收3个参数,但自定义函数定义了4个入参,会触发PHP参数缺失警告。
  • 缺少空值校验:get_page_by_title如果没有匹配到对应标题的wpsl_stores类型文章,会返回null,此时直接访问$vendor_data_new->ID会触发PHP致命错误,输出带<style>标签的wp_die错误页面,也就是你日志里看到的异常内容。
  • 冗余的订单实例化:过滤器传入的$order_obj本身就是WC_Order实例,不需要再次通过订单号重复查询。
  • 订单项ID作用域错误:foreach遍历所有订单项后,$item_id仅保留最后一个订单项的ID,如果订单无订单项还会触发未定义变量警告。
  • 字段绑定逻辑问题:原代码固定给第一个订单项加字段,会导致多商品订单的地址字段绑定错误。

修复后可运行代码

function get_address_store( $response, $order_obj, $request ) {
    if( empty( $response->data ) || empty($response->data['line_items']) )
        return $response;
    
    // 直接使用传入的订单实例,无需重复查询
    $items = $order_obj->get_items(); 
    foreach ( $items as $index => $item ) {
        $item_id = $item->get_id();
        $gift_wrap = wc_get_order_item_meta( $item_id, 'anbieter', true );
        if(empty($gift_wrap)) continue;

        $vendor_data_new = get_page_by_title($gift_wrap, '', 'wpsl_stores');
        // 增加空值判断,避免空指针报错
        if($vendor_data_new){
            $addresscustom = get_post_meta( $vendor_data_new->ID, 'wpsl_address', true );
            // 给对应索引的订单项绑定地址字段
            $response->data['line_items'][$index]['store_address'] = $addresscustom;
        }
    }

    return $response;
} 
// 调整参数数量为3,和函数入参匹配
add_filter( "woocommerce_rest_prepare_shop_order_object","get_address_store", 10, 3 );

内容的提问来源于stack exchange,提问作者cabral279

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 09:06:03