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

