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

WooCommerce实现ACF字段VIN值在结账及订单摘要显示

解决WooCommerce VIN字段传递到订单摘要问题

1. 确保VIN字段仅在指定分类产品页渲染

先替换原有字段渲染逻辑,确保仅在antallaktika分类的产品页显示VIN输入框,并绑定到加购表单:

// 在单个产品页添加VIN输入字段(仅antallaktika分类)
add_action('woocommerce_before_add_to_cart_button', 'add_vin_field_to_target_category');
function add_vin_field_to_target_category() {
    global $product;
    
    // 校验产品所属分类
    if (has_term('antallaktika', 'product_cat', $product->get_id())) {
        ?>
        <div class="vin-field-group">
            <label for="vehicle_vin"><?php esc_html_e('车辆VIN码(17位)', 'woocommerce'); ?></label>
            <input type="text" id="vehicle_vin" name="vehicle_vin" placeholder="<?php esc_attr_e('请输入17位VIN码', 'woocommerce'); ?>" maxlength="17" required>
        </div>
        <?php
    }
}

2. 验证并将VIN值存入购物车项

这一步是核心,确保VIN值被正确绑定到购物车项,避免同产品不同VIN被合并:

// 验证VIN格式并保存到购物车数据
add_filter('woocommerce_add_cart_item_data', 'save_vin_to_cart_item', 10, 3);
function save_vin_to_cart_item($cart_item_data, $product_id, $variation_id) {
    if (isset($_POST['vehicle_vin']) && !empty($_POST['vehicle_vin'])) {
        $vin = sanitize_text_field($_POST['vehicle_vin']);
        
        // 强制校验17位长度
        if (strlen($vin) !== 17) {
            wc_add_notice(__('VIN码必须为17位字符', 'woocommerce'), 'error');
            return $cart_item_data;
        }
        
        // 添加唯一标识,避免同产品不同VIN被合并
        $cart_item_data['vehicle_vin'] = $vin;
        $cart_item_data['unique_vin_key'] = md5(microtime().rand());
    }
    return $cart_item_data;
}

3. 在购物车订单摘要显示VIN

让用户在购物车页面能看到已输入的VIN信息:

// 在购物车页面展示VIN码
add_filter('woocommerce_get_item_data', 'display_vin_in_cart_summary', 10, 2);
function display_vin_in_cart_summary($item_data, $cart_item) {
    if (isset($cart_item['vehicle_vin'])) {
        $item_data[] = array(
            'key' => __('车辆VIN码', 'woocommerce'),
            'value' => wc_clean($cart_item['vehicle_vin'])
        );
    }
    return $item_data;
}

4. 将VIN永久保存到订单元数据

确保订单生成后,VIN值被存入订单记录:

// 把VIN保存到订单行项目元数据
add_action('woocommerce_checkout_create_order_line_item', 'save_vin_to_order_record', 10, 4);
function save_vin_to_order_record($item, $cart_item_key, $cart_item, $order) {
    if (isset($cart_item['vehicle_vin'])) {
        $item->add_meta_data(__('车辆VIN码', 'woocommerce'), $cart_item['vehicle_vin'], true);
    }
}

5. 在订单详情/邮件中显示VIN

让管理员和用户在订单详情页、通知邮件里都能看到VIN:

// 统一订单中VIN字段的显示名称
add_filter('woocommerce_order_item_display_meta_key', 'format_vin_meta_key', 10, 3);
function format_vin_meta_key($display_key, $meta, $item) {
    if ($meta->key === '_vehicle_vin') {
        return __('车辆VIN码', 'woocommerce');
    }
    return $display_key;
}

操作说明

  • 将所有代码添加到主题的functions.php文件,或使用代码片段插件(如Code Snippets)执行
  • 若你用ACF创建了VIN字段,需将代码中vehicle_vin替换为你的ACF字段键
  • 测试流程:进入antallaktika分类产品页→输入17位VIN→加购→查看购物车显示→完成结账→检查订单详情是否保留VIN值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:35:12