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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:21:27