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

