如何实现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
相关产品推荐
相关产品推荐

