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

WooCommerce中ACF字段存入订单元数据及多场景显示问题求助

解决WooCommerce同步ACF字段到购物车及订单的问题

你的代码存在参数错误、变量未定义、钩子用法过时、数据未正确存储/输出等问题,以下是修正后的完整代码,可实现ACF字段从产品页到购物车、订单的同步显示与存储:

// 产品页面显示ACF字段
add_action( 'woocommerce_before_add_to_cart_button', 'display_acf_single_product_pages', 1 );
function display_acf_single_product_pages() {
    global $product;

    $calories = get_field( 'acf-calories',  $product->get_id() );
    $delivery_date = get_field( 'acf-delivery_date', $product->get_id() );

    // 输出字段内容(按需调整HTML结构)
    if ( $calories ) {
        echo '<p><strong>卡路里:</strong>' . esc_html( $calories ) . '</p>';
    }
    if ( $delivery_date ) {
        echo '<p><strong>配送日期:</strong>' . esc_html( $delivery_date ) . '</p>';
    }
}

// 将ACF字段保存为购物车项自定义数据
add_filter( 'woocommerce_add_cart_item_data', 'save_acf_as_cart_item_data', 10, 2 );
function save_acf_as_cart_item_data( $cart_item_data, $product_id ) {
    // 获取产品的ACF字段值
    $calories = get_field( 'acf-calories', $product_id );
    $delivery_date = get_field( 'acf-delivery_date', $product_id );

    // 将字段值存入购物车项数据
    if ( $calories ) {
        $cart_item_data['acf-calories'] = $calories;
    }
    if ( $delivery_date ) {
        $cart_item_data['acf-delivery_date'] = $delivery_date;
    }

    // 添加唯一键确保同一产品多次添加时数据独立
    $cart_item_data['unique_key'] = md5( microtime() . rand() );
    return $cart_item_data;
}

// 从会话中恢复购物车项的ACF数据
add_action( 'woocommerce_get_cart_item_from_session', 'cart_item_from_session', 99, 3 );
function cart_item_from_session( $cart_item, $values, $key ) {
    // 恢复ACF字段到购物车项
    if ( isset( $values['acf-calories'] ) ) {
        $cart_item['acf-calories'] = $values['acf-calories'];
    }
    if ( isset( $values['acf-delivery_date'] ) ) {
        $cart_item['acf-delivery_date'] = $values['acf-delivery_date'];
    }
    return $cart_item;
}

// 购物车和结账页面显示ACF字段
add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 );
function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) {
    // 添加卡路里到购物车显示
    if ( isset( $cart_item['acf-calories'] ) ) {
        $cart_data[] = array(
            'key'   => '卡路里',
            'value' => esc_html( $cart_item['acf-calories'] )
        );
    }
    // 添加配送日期到购物车显示
    if ( isset( $cart_item['acf-delivery_date'] ) ) {
        $cart_data[] = array(
            'key'   => '配送日期',
            'value' => esc_html( $cart_item['acf-delivery_date'] )
        );
    }
    return $cart_data;
}

// 将ACF字段保存到订单项,并在订单和邮件中显示
add_action( 'woocommerce_checkout_create_order_line_item', 'display_acf_on_orders_and_emails', 10, 4 );
function display_acf_on_orders_and_emails( $item, $cart_item_key, $values, $order ) {
    // 添加卡路里到订单项
    if ( isset( $values['acf-calories'] ) ) {
        $item->add_meta_data( 'acf-calories', $values['acf-calories'] );
    }
    // 添加配送日期到订单项
    if ( isset( $values['acf-delivery_date'] ) ) {
        $item->add_meta_data( 'acf-delivery_date', $values['acf-delivery_date'] );
    }
}

// 修改后台订单项的元数据显示标签
add_filter('woocommerce_order_item_display_meta_key', 'filter_wc_order_item_display_meta_key', 10, 3 );
function filter_wc_order_item_display_meta_key( $display_key, $meta, $item ) {
    if( is_admin() && $item->get_type() === 'line_item' ) {
        if( $meta->key === 'acf-calories' ) {
            $display_key = __("卡路里", "woocommerce");
        }
        if( $meta->key === 'acf-delivery_date' ) {
            $display_key = __("配送日期", "woocommerce");
        }
    }
    return $display_key;
}

关键修改说明:

  • 产品页面显示:原代码只获取字段值未输出,新增echo语句将字段内容显示在加入购物车按钮上方,可按需调整HTML样式。
  • 购物车数据存储:修正woocommerce_add_cart_item_data的参数,正确通过get_field获取ACF值并存入购物车项数据,确保返回处理后的变量。
  • 会话数据恢复:修正钩子参数,从会话值中恢复ACF字段到购物车项,保证页面刷新后数据不丢失。
  • 购物车/结账显示:从购物车项数据中读取ACF值,添加到显示数组并返回,确保字段在购物车和结账页面正常展示。
  • 订单数据存储:使用官方推荐的woocommerce_checkout_create_order_line_item钩子,通过$item->add_meta_data将ACF字段存入订单项,替代过时的旧钩子。
  • 变量与参数修正:修复所有未定义变量、参数引用错误的问题,确保每个函数逻辑合法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:05:40