如何在WooCommerce购物车含指定分类商品时添加结账自定义字段
WooCommerce 结账页条件显示自定义字段(仅后台可见)实现指引
1. 编写购物车分类检测辅助函数
先写一个函数,用来判断购物车内是否存在目标分类的商品,后续所有逻辑都依赖这个判断:
function has_target_category_in_cart() { // 替换成你的目标商品分类slug或ID $target_category = 'your-target-category'; foreach (WC()->cart->get_cart() as $cart_item) { $product = $cart_item['data']; // 检查当前商品是否属于目标分类 if (has_term($target_category, 'product_cat', $product->get_id())) { return true; } } return false; }
2. 用ACF创建订单专属字段组
- 打开ACF后台,新建字段组(比如命名为「结账后台专属字段」)
- 设置位置规则:选择「Post Type」等于「Order」
- 添加你需要的自定义字段(文本框、下拉框等),记住每个字段的字段名(如
custom_checkout_field_1) - 保存字段组,同时记下字段组的ID(在字段组编辑页URL中,比如
post.php?post=123&action=edit里的123,后续要写成group_123)
3. 在结账页条件显示ACF字段
通过WooCommerce钩子,只在购物车存在目标分类商品时,加载ACF字段到结账页:
add_action('woocommerce_after_order_notes', 'display_target_checkout_fields'); function display_target_checkout_fields($checkout) { // 购物车无目标分类商品则直接返回 if (!has_target_category_in_cart()) { return; } // 加载指定ACF字段组到结账页 acf_form(array( 'post_id' => 'new_post', // 标识为新订单 'field_groups' => array('group_xxxxxx'), // 替换为你的ACF字段组ID 'form' => false, // 不生成完整表单,只输出字段 'return' => add_query_arg('updated', 'true', get_permalink()), )); }
4. 保存结账字段值到订单
在订单创建时,把结账页填写的ACF字段值同步保存到订单元数据:
add_action('woocommerce_checkout_create_order', 'save_target_fields_to_order', 10, 2); function save_target_fields_to_order($order, $data) { if (!has_target_category_in_cart()) { return; } // 替换为你创建的ACF字段名列表 $target_fields = array('custom_checkout_field_1', 'custom_checkout_field_2'); foreach ($target_fields as $field) { if (isset($_POST[$field])) { update_field($field, $_POST[$field], $order->get_id()); } } }
5. 确保字段仅后台可见
因为ACF字段组的位置规则已设为仅「Order」类型,前台默认不会显示。如果需要彻底屏蔽客户在前台订单详情页看到这些字段,可添加以下代码:
add_filter('acf/format_value', 'hide_fields_from_frontend_order', 10, 3); function hide_fields_from_frontend_order($value, $post_id, $field) { // 前台订单详情页隐藏指定字段 if (!is_admin() && is_wc_endpoint_url('view-order')) { $target_fields = array('custom_checkout_field_1', 'custom_checkout_field_2'); if (in_array($field['name'], $target_fields)) { return ''; } } return $value; }
6. 排除字段在订单确认邮件中显示
WooCommerce默认不会把ACF订单字段加入邮件,若有主题/插件自动添加的情况,可通过以下代码移除:
add_filter('woocommerce_email_order_meta_fields', 'remove_fields_from_order_email', 10, 3); function remove_fields_from_order_email($fields, $sent_to_admin, $order) { // 移除邮件中的指定字段 $fields_to_remove = array('custom_checkout_field_1', 'custom_checkout_field_2'); foreach ($fields_to_remove as $field) { unset($fields[$field]); } return $fields; }
内容的提问来源于stack exchange,提问作者SAH
相关产品推荐
相关产品推荐

