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
相关产品推荐
相关产品推荐

