获取WooCommerce可变产品订单的ACF字段值问题求助
解决WooCommerce可变产品及变体ACF字段导出为空的问题
一、ACF字段组设置调整
首先要确保ACF字段组正确关联到可变产品和产品变体:
- 进入ACF后台,编辑目标字段组
- 在位置规则中添加两条规则:
- 规则1:
Post Type→is equal to→Product(覆盖可变产品父级) - 规则2:
Post Type→is equal to→Product Variation(覆盖产品变体)
- 规则1:
- 保存字段组,确认字段能在可变产品父编辑页、变体编辑页正常显示并保存值
二、PHP代码修改
问题核心:订单中的可变产品条目对应的是变体对象,原代码直接用变体ID获取字段,但如果字段存储在父产品上就会取不到值。修改后的代码会优先读取变体自身的ACF字段,取不到则 fallback 到父产品字段。
替换后的my_get_order_items函数:
function my_get_order_items($Bestell_id) { if (!$Bestell_id) { return false; } $order = wc_get_order($Bestell_id); if (!$order) { return false; } $order_details = ""; foreach ($order->get_items() as $item_id => $item) { $product = $item->get_product(); if (!$product) { continue; } // 过滤指定产品类型 if (!(strpos($item->get_name(), 'KERAMIKTASSE') !== false || strpos($item->get_name(), 'BAUMWOLLTASCHE') !== false || strpos($item->get_name(), 'T-SHIRT') !== false)) { continue; } // 获取产品ID与父产品ID(变体专属) $product_id = $product->get_id(); $parent_id = $product->is_type('variation') ? $product->get_parent_id() : $product_id; $order_details .= "**LT**item**GT**"; $order_details .= "**LT**ID**GT**" . $product->get_sku() . "**LT**/ID**GT**"; $order_details .= "**LT**produktname**GT**" . $item->get_name() . "**LT**/produktname**GT**"; $order_details .= "**LT**amount**GT**" . $item->get_quantity() . "**LT**/amount**GT**"; // 封装ACF字段获取逻辑:先取变体,再取父产品 $get_acf_field = function($field_key) use ($product_id, $parent_id) { $value = get_field($field_key, $product_id); return $value !== null ? $value : get_field($field_key, $parent_id); }; $order_details .= "**LT**upload**GT**" . maybe_serialize($get_acf_field('upload')) . "**LT**/upload**GT**"; $order_details .= "**LT**size**GT**" . maybe_serialize($get_acf_field('size')) . "**LT**/size**GT**"; $order_details .= "**LT**groesse**GT**" . maybe_serialize($get_acf_field('produktgröße')) . "**LT**/groesse**GT**"; $order_details .= "**LT**material**GT**" . maybe_serialize($get_acf_field('material')) . "**LT**/material**GT**"; $order_details .= "**LT**print**GT**" . maybe_serialize($get_acf_field('print')) . "**LT**/print**GT**"; $order_details .= "**LT**variante**GT**" . maybe_serialize($get_acf_field('variante')) . "**LT**/variante**GT**"; $order_details .= "**LT**category**GT**" . maybe_serialize($get_acf_field('category')) . "**LT**/category**GT**"; // 处理Options区域的ACF字段 $order_details .= "**LT**Options**GT**"; $order_details .= "**LT**Option**GT****LT**ID**GT**1996**LT**/ID**GT****LT**Value**GT**" . maybe_serialize($get_acf_field('value_115')) . "**LT**/Value**GT****LT**/Option**GT**"; $order_details .= "**LT**Option**GT****LT**ID**GT**2489**LT**/ID**GT****LT**Value**GT**" . maybe_serialize($get_acf_field('value_117')) . "**LT**/Value**GT****LT**/Option**GT**"; $order_details .= "**LT**Option**GT****LT**ID**GT**2056**LT**/ID**GT****LT**Value**GT**" . maybe_serialize($get_acf_field('value_118')) . "**LT**/Value**GT****LT**/Option**GT**"; $order_details .= "**LT**/Options**GT**"; $order_details .= "**LT**/item**GT**"; } return $order_details; }
代码修改要点:
- 父产品ID获取:通过
$product->is_type('variation')判断是否为变体,自动获取父产品ID - 字段优先级逻辑:匿名函数
$get_acf_field先尝试读取变体自身的字段值,若为空则读取父产品的对应字段 - 统一调用方式:所有ACF字段调用都通过该函数,保证逻辑一致且代码简洁
三、验证测试
- 保存修改后的PHP代码与ACF设置
- 重新运行WP ALL EXPORT PRO导出任务
- 检查导出的XML文件,确认可变产品及变体的ACF字段值已正常显示
内容的提问来源于stack exchange,提问作者Orko22
相关产品推荐
相关产品推荐

