如何让WooCommerce自定义字段billing_vat固定15位且适配结账和账户地址页?
现有代码的问题
- 逻辑完全写反:原验证代码判断
strlen( $_POST['billing_vat'] ) == 15时抛出错误,和「长度不等于15才报错」的需求完全相反,会导致正确填写15位内容时反而无法提交 - 语法错误:代码片段里的逻辑与运算符被转义成了HTML实体
&&,直接复制使用会触发PHP语法错误,这是网站崩溃的核心原因 woocommerce_billing_fields钩子使用不当:修改账单字段后必须返回完整的字段数组,仅返回自定义字段会导致其他默认账单字段丢失- 缺少用户账户页的地址保存验证钩子,仅加结账页验证不会作用于账户地址修改场景
完整实现代码
以下代码可直接添加到当前主题的functions.php文件或自定义功能插件中生效:
步骤1:给billing_vat字段添加前端长度限制+提示
add_filter( 'woocommerce_billing_fields', 'customize_billing_vat_field', 10, 1 ); function customize_billing_vat_field( $fields ) { // 仅修改billing_vat字段参数,不改动其他默认字段 if ( isset( $fields['billing_vat'] ) ) { $fields['billing_vat']['maxlength'] = 15; $fields['billing_vat']['description'] = '若填写请输入15位内容'; // 可选:如果要求VAT为纯数字,可以开启下面的配置 // $fields['billing_vat']['type'] = 'number'; } // 必须返回完整的字段数组,否则其他账单字段会消失 return $fields; }
步骤2:添加结账页提交验证
add_action( 'woocommerce_checkout_process', 'validate_billing_vat_field' ); function validate_billing_vat_field() { // 字段非空时才触发校验 if ( isset( $_POST['billing_vat'] ) && ! empty( trim( $_POST['billing_vat'] ) ) ) { $vat = trim( $_POST['billing_vat'] ); // 校验长度是否为15位,若要求纯数字可补充ctype_digit($vat)判断 if ( strlen( $vat ) !== 15 ) { wc_add_notice( 'VAT必须为15位', 'error' ); } } }
步骤3:添加用户账户页账单地址保存验证
add_action( 'woocommerce_customer_save_address', 'validate_account_billing_vat', 10, 2 ); function validate_account_billing_vat( $user_id, $load_address ) { // 仅校验账单地址场景 if ( $load_address === 'billing' && isset( $_POST['billing_vat'] ) && ! empty( trim( $_POST['billing_vat'] ) ) ) { $vat = trim( $_POST['billing_vat'] ); if ( strlen( $vat ) !== 15 ) { wc_add_notice( 'VAT必须为15位', 'error' ); } } }
内容的提问来源于stack exchange,提问作者Bassam Radi
相关产品推荐
相关产品推荐

