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

WordPress导出插件PHP代码修复:订单子项数组化与完整显示

解决WordPress导出插件中JSON生成的两个问题

我来帮你搞定这两个问题,咱们先看看原代码里的问题所在,再给出修改后的完整代码:

问题分析

  1. order_item只显示最后一个子项:原代码在遍历每个订单的order_items时,每次都直接给$post['order_item']赋值新的对象,这会覆盖掉之前的子项,最后自然只剩最后一个。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:11:46