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

WooCommerce注册表单添加推荐码有效性校验需求

实现WooCommerce注册表单推荐码校验与关联功能

我帮你梳理一下完整的实现步骤,避开你之前改条款代码的误区——其实不需要动条款逻辑,直接针对WooCommerce注册流程的钩子来做就好,全程用代码片段实现(可以放到主题的functions.php里,或者用自定义代码插件):

1. 在注册表单添加推荐码输入框

首先,我们需要在WooCommerce默认注册表单里加一个推荐码输入字段:

add_action('woocommerce_register_form', 'add_referral_code_field_to_registration');
function add_referral_code_field_to_registration() {
    ?>
    <p class="form-row form-row-wide">
        <label for="referral_code"><?php _e('推荐码', 'woocommerce'); ?> <span class="required">*</span></label>
        <input type="text" class="input-text" name="referral_code" id="referral_code" value="<?php if (!empty($_POST['referral_code'])) echo esc_attr($_POST['referral_code']); ?>" />
    </p>
    <?php
}

这里加了required标记,确保用户必须填写推荐码;如果你的需求是可选的,可以去掉这个标记。

2. 验证推荐码的有效性

接下来,通过注册错误钩子来校验推荐码是否存在于ACF选项页的重复字段中:

add_filter('woocommerce_registration_errors', 'validate_referral_code_during_registration', 10, 3);
function validate_referral_code_during_registration($errors, $username, $email) {
    // 获取用户输入的推荐码
    $submitted_code = isset($_POST['referral_code']) ? trim($_POST['referral_code']) : '';

    // 1. 检查是否为空(如果是必填项的话)
    if (empty($submitted_code)) {
        $errors->add('referral_code_empty', __('请输入推荐码', 'woocommerce'));
        return $errors;
    }

    // 2. 从ACF选项页获取所有有效的推荐码
    $valid_referral_codes = get_field('referral_codes', 'option'); // 替换成你的ACF重复字段名
    $code_exists = false;

    // 遍历重复字段,检查输入的码是否存在
    if ($valid_referral_codes) {
        foreach ($valid_referral_codes as $code_entry) {
            // 替换成你重复字段里的子字段名(比如你存推荐码的子字段叫code)
            if (trim($code_entry['code']) === $submitted_code) {
                $code_exists = true;
                break;
            }
        }
    }

    // 3. 如果推荐码不存在,添加错误阻止注册
    if (!$code_exists) {
        $errors->add('referral_code_invalid', __('无效的推荐码,请检查后重新输入', 'woocommerce'));
    }

    return $errors;
}

⚠️ 注意:这里需要替换两个地方的字段名:

  • 'referral_codes':你的ACF选项页重复字段的名称
  • 'code':重复字段中存储推荐码的子字段名称

3. 将有效推荐码关联到用户

校验通过后,把推荐码保存到用户的元数据中:

add_action('user_register', 'save_referral_code_to_user', 10, 1);
function save_referral_code_to_user($user_id) {
    if (isset($_POST['referral_code'])) {
        $referral_code = trim($_POST['referral_code']);
        update_user_meta($user_id, 'user_referral_code', $referral_code);
    }
}

这里用user_referral_code作为用户元数据的键,你可以根据需要修改。

4. 在用户后台显示关联的推荐码

最后,在用户的账户页面(后台个人中心)展示已关联的推荐码:

add_action('woocommerce_account_dashboard', 'display_user_referral_code_on_dashboard');
function display_user_referral_code_on_dashboard() {
    $user_id = get_current_user_id();
    $referral_code = get_user_meta($user_id, 'user_referral_code', true);

    if (!empty($referral_code)) {
        ?>
        <div class="woocommerce-message">
            <?php printf(__('你的推荐码:<strong>%s</strong>', 'woocommerce'), esc_html($referral_code)); ?>
        </div>
        <?php
    }
}

或者你也可以把它放到账户编辑页面,用woocommerce_edit_account_form钩子,做成只读字段:

add_action('woocommerce_edit_account_form', 'display_referral_code_in_edit_account');
function display_referral_code_in_edit_account() {
    $user_id = get_current_user_id();
    $referral_code = get_user_meta($user_id, 'user_referral_code', true);
    ?>
    <p class="form-row form-row-wide">
        <label for="user_referral_code"><?php _e('你的推荐码', 'woocommerce'); ?></label>
        <input type="text" class="input-text" name="user_referral_code" id="user_referral_code" value="<?php echo esc_attr($referral_code); ?>" readonly />
    </p>
    <?php
}

为什么之前改条款代码没成功?

因为条款逻辑是针对同意协议的校验,和推荐码校验是完全独立的流程,我们需要直接拦截注册错误的钩子woocommerce_registration_errors,这才是注册校验的正确入口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:25:07