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

获取WooCommerce可变产品订单的ACF字段值问题求助

解决WooCommerce可变产品及变体ACF字段导出为空的问题

一、ACF字段组设置调整

首先要确保ACF字段组正确关联到可变产品和产品变体:

  • 进入ACF后台,编辑目标字段组
  • 在位置规则中添加两条规则:
    • 规则1:Post Type → is equal to → Product(覆盖可变产品父级)
    • 规则2:Post Type → is equal to → Product Variation(覆盖产品变体)
  • 保存字段组,确认字段能在可变产品父编辑页、变体编辑页正常显示并保存值

二、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;
}

代码修改要点:

  1. 父产品ID获取:通过$product->is_type('variation')判断是否为变体,自动获取父产品ID
  2. 字段优先级逻辑:匿名函数$get_acf_field先尝试读取变体自身的字段值,若为空则读取父产品的对应字段
  3. 统一调用方式:所有ACF字段调用都通过该函数,保证逻辑一致且代码简洁

三、验证测试

  1. 保存修改后的PHP代码与ACF设置
  2. 重新运行WP ALL EXPORT PRO导出任务
  3. 检查导出的XML文件,确认可变产品及变体的ACF字段值已正常显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:05:02