WordPress导出插件PHP代码修复:订单子项数组化与完整显示
解决WordPress导出插件中JSON生成的两个问题
我来帮你搞定这两个问题,咱们先看看原代码里的问题所在,再给出修改后的完整代码:
问题分析
- order_item只显示最后一个子项:原代码在遍历每个订单的
order_items时,每次都直接给$post['order_item']赋值新的对象,这会覆盖掉之前的子项,最后自然只剩最后一个。 - order_item不是数组结构:原代码里
$post['order_item']被赋值为单个对象,而不是数组,不符合你要的方括号包裹的数组格式。
修改后的完整代码
function woo_ce_export_dataset_override_order( $output = null, $export_type = null) { global $export; $orders = woo_ce_get_orders( 'order', $export->args ); if( !empty( $orders ) ) { if( !empty( $export->fields ) ) { $export->total_columns = $size = count( $export->columns ); $output = [ "transaction_date" => date('Ymd'), "neworders" => [] ]; if( !empty( $export->fields ) ) { foreach( $orders as $order ) { $args = $export->args; $order = woo_ce_get_order_data( $order, 'order', $args, array_keys( $export->fields ) ); // 初始化订单基础数据数组,避免遗留旧数据 $post = []; foreach( array_keys( $export->fields ) as $key => $field ) { if( isset( $order->$field ) && isset( $export->columns[$key] ) ) { $post[ $export->columns[$key] ] = $order->$field; } } // 提前初始化order_item为数组,保证结构一致性 $post['order_item'] = []; if( !empty( $order->order_items ) ) { foreach( $order->order_items as $order_item ) { // 临时存储当前子项的字段数据 $item_data = []; foreach( array_keys( $export->fields ) as $key => $field ) { if( isset( $order_item->$field ) && isset( $export->columns[$key] ) ) { $item_data[ $export->columns[$key] ] = $order_item->$field; } } // 将当前子项添加到order_item数组中,避免覆盖 $post['order_item'][] = $item_data; } } $output['neworders'][] = $post; } } } } return array($output); }
关键修改点说明
- 初始化
$post数组:原代码未提前声明$post,可能导致遗留旧数据,现在提前设为空数组更安全。 - 初始化
$post['order_item']为数组:不管订单有没有子项,先把它设为空数组,保证所有订单的输出结构一致;如果不需要空数组,也可以把这行移到if( !empty( $order->order_items ) )内部。 - 临时存储子项数据并追加到数组:遍历每个子项时,先用
$item_data存储当前项的字段,再把这个数组追加到$post['order_item']里,既不会覆盖之前的子项,又能生成你需要的数组结构。
这样修改后,就能生成你期望的JSON输出:每个订单的order_item会是包含所有子项的数组,不会再丢失前面的子项。
内容的提问来源于stack exchange,提问作者specex
相关产品推荐
相关产品推荐

