You need to enable JavaScript to run this app. WooCommerce TM EPO订单导出:如何访问$tm_fields标签取对应字段值
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce TM EPO订单导出:如何访问$tm_fields标签取对应字段值

代码调整实现方案

核心逻辑调整说明

原实现的问题是解析TM EPO数据时,会提前把字段的name和value拼接为单字符串存储,导致无法拆分给共享同一批section ID的Day Field、Time Field两个独立导出列。调整时会把每个section下的name、value分维度独立存储,再根据导出列的标签规则匹配取值。

具体改动项

  • 修复原代码中if块未加大括号导致的数组初始化逻辑bug
  • 解析序列化的_tmcartepo_data数据时,为每个section ID单独维护两个存储队列,分别存放该section下所有字段的name值、value值,不提前拼接字符串
  • 遍历导出列时,根据列名(即$tm_fields的键值)匹配取值规则:
    • Day Field 取对应section的name值集合
    • Time Field、Side Field、Bundle Field 取对应section的value值集合
  • 去掉旧的format_line拼接函数,避免额外的格式干扰

调整后的完整可运行代码

class TM_EPO_Order_Export_Integration {
    public $tm_fields = array( 
        'Day Field' => ['6012beca7979e4.51764573', '6012c0481b1b30.37462970', '6012c0581b1b46.84309510', '6012c05a1b1b51.41167065', '6012c05c1b1b65.99820650', '604a3a296c3179.70414672', '604a3ac46c3183.55870947', '604a3ac66c3193.93047952', '604a3ac96c31a4.57982566', '604a3acb6c31b2.86456982'],
        'Time Field' => ['6012beca7979e4.51764573', '6012c0481b1b30.37462970', '6012c0581b1b46.84309510', '6012c05a1b1b51.41167065', '6012c05c1b1b65.99820650', '604a3a296c3179.70414672', '604a3ac46c3183.55870947', '604a3ac66c3193.93047952', '604a3ac96c31a4.57982566', '604a3acb6c31b2.86456982'],
        'Side Field' => ['6012b57d151e28.97324618', 'pa_side-dish'],
        'Bundle Field' => ['pa_second-dish', 'pa_main-dish'],
    );

    public function __construct() {
        add_filter('woe_get_order_product_fields', array($this, 'add_product_fields') );
        add_filter('woe_get_order_product_item_meta', array($this, 'fill_tm_fields') );
    }

    public function add_product_fields($fields) {
        foreach($this->tm_fields as $col_name => $element_ids) {
            $fields['tm_field_'.$col_name] = array(
                'label' => $col_name,
                'colname' => $col_name,
                'checked' => 1
            );
        }   
        return $fields;
    }

    public function fill_tm_fields($item_meta) {
        $product_fields = array();
        
        // 解析TM EPO原始序列化数据
        if( isset($item_meta["_tmcartepo_data"])  AND  is_array($tmfields = maybe_unserialize($item_meta["_tmcartepo_data"][0]))  ) {
            foreach($tmfields as $tm_field) {
                $element_id = $tm_field['section'];
                // 初始化每个section的分维度存储结构
                if( !isset($product_fields[$element_id]) ) {
                    $product_fields[$element_id] = array(
                        'names' => [],
                        'values' => []
                    );
                }
                // 分别存入name和value,不做提前拼接
                $product_fields[$element_id]['names'][] = trim($tm_field['name']);
                $product_fields[$element_id]['values'][] = trim($tm_field['value']);
            }
        }

        // 按导出列规则组装数据
        foreach($this->tm_fields as $col_name => $element_ids) {
            $col_values = [];
            foreach($element_ids as $element_id) {
                if( !isset($product_fields[$element_id]) ) continue;
                // 匹配列名决定取值类型
                if ($col_name === 'Day Field') {
                    $col_values = array_merge($col_values, $product_fields[$element_id]['names']);
                } else {
                    $col_values = array_merge($col_values, $product_fields[$element_id]['values']);
                }
            }
            // 去重后拼接为列值
            $item_meta['tm_field_'.$col_name] = array( join("\n", array_unique($col_values)) );
        }   
        return $item_meta;
    }
}

实际输出效果

  • Day Field 列单独展示选中的星期值(字段name属性:Monday、Tuesday、Wednesday等),不附带时段信息
  • Time Field 列单独展示同批次选中的时段值(字段value属性:Lunch、Dinner等),不附带星期信息
  • Side Field、Bundle Field 列保持原有逻辑,展示对应配菜、套餐的实际选择内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 18:57:03