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

如何实现WooCommerce注册表单企业名称字段的用户唯一性验证

WooCommerce注册表单企业名称唯一验证修复

你的代码存在几个关键问题导致无法正常运行,以下是问题分析和修正后的代码:

问题点

  • 钩子选择错误:woocommerce_created_customer是用户创建完成后触发的钩子,此时已经无法阻止重复企业名称的用户注册,应该使用woocommerce_register_post(注册提交后、用户创建前触发的验证钩子)。
  • 函数名拼写错误:钩子中注册的函数名是custom_billing_company_validation,但定义的函数是custom__billing_company_validation(多了一个下划线),导致函数无法被调用。
  • 未定义变量:代码中使用了$user->ID,但在注册验证阶段用户还未创建,该变量不存在,且注册场景下无需排除当前用户(本身就是新用户)。
  • SQL查询不安全且逻辑错误:直接将用户输入拼入SQL语句存在注入风险,且get_row返回的是对象,用$count > 0判断是否存在重复是错误的,应该用get_var获取匹配数量。

修正后的代码

add_action( 'woocommerce_register_post', 'custom_billing_company_validation', 10, 3 );
function custom_billing_company_validation( $username, $email, $errors ) {
    // 获取提交的企业名称
    $billing_company = isset( $_POST['billing_company'] ) ? sanitize_text_field( $_POST['billing_company'] ) : '';

    if ( ! empty( $billing_company ) ) {
        global $wpdb;

        // 安全查询已存在的企业名称数量
        $count = $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(user_id) FROM $wpdb->usermeta 
             WHERE meta_key = 'billing_company' AND meta_value = %s",
            $billing_company
        ) );

        // 如果存在重复,添加错误提示
        if ( $count > 0 ) {
            $errors->add( 'billing_company_error', __( '该企业名称已存在,请联系我们。', 'woocommerce' ) );
        }
    }
}

补充说明

  • 使用$_POST['billing_company']直接获取表单提交值,因为woocommerce_register_post钩子的参数中没有包含账单字段数据。
  • 用$wpdb->prepare处理SQL查询,避免SQL注入风险。
  • 使用COUNT(user_id)获取重复数量,通过get_var直接返回数字,判断逻辑更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:10:01