如何在Woocommerce结账页禁用非洲国家的邮政编码/邮编必填项
问题根因
- 字段选择器不匹配:WooCommerce默认结账页账单邮编字段ID为
#billing_postcode,邮寄邮编ID为#shipping_postcode,你使用的#postalCode仅适配了部分主题对尼日利亚、安哥拉的特殊字段配置,喀麦隆、加纳等国家加载的默认字段无法命中该选择器,修改不生效 - 校验逻辑不完整:仅修改DOM的
required属性无法绕过WooCommerce自带的前端表单校验规则、后端提交校验,后续提交还是会触发必填报错 - 未适配表单重载逻辑:国家切换时WooCommerce会自动重载字段配置,你修改的属性会被默认配置覆盖
完整修复代码
将以下代码添加到当前主题的functions.php文件末尾即可:
<?php // 前端修改邮编必填逻辑 add_action( 'wp_footer', function () { // 仅在结账页加载脚本 if ( ! is_checkout() ) return; ?> <script> jQuery(function($){ // 非洲国家ISO编码列表 const africanCountries = ['DZ','AO','BJ','BW','BF','BI','CM','CV','CF','TD','KM','CG','CD','DJ','EG','GQ','ER','ET','GA','GM','GH','GN','GW','CI','KE','LS','LR','LY','MG','MW','ML','MR','MU','MA','MZ','NA','NE','NG','RW','SN','SC','SL','SO','ZA','SS','SD','SZ','TZ','TG','TN','UG','ZM','ZW']; // 切换国家时修改校验规则 function togglePostcodeRequired() { const selectedCountry = $('select[name="billing_country"]').val(); const isAfrican = africanCountries.includes(selectedCountry); // 修改账单邮编 $('#billing_postcode').prop('required', !isAfrican); // 修改邮寄邮编 $('#shipping_postcode').prop('required', !isAfrican); // 移除WooCommerce自带的校验规则 if (isAfrican) { $('#billing_postcode').removeClass('validate-required').parent().removeClass('validate-required'); $('#shipping_postcode').removeClass('validate-required').parent().removeClass('validate-required'); } else { $('#billing_postcode').addClass('validate-required').parent().addClass('validate-required'); $('#shipping_postcode').addClass('validate-required').parent().addClass('validate-required'); } } // 页面加载初始化执行一次 togglePostcodeRequired(); // 国家切换时执行 $(document.body).on('change', 'select[name="billing_country"], select[name="shipping_country"]', togglePostcodeRequired); // 结账表单更新后重新执行,避免被重载覆盖 $(document.body).on('updated_checkout', togglePostcodeRequired); }); </script> <?php } ); // 后端关闭非洲国家的邮编必填校验 add_filter( 'woocommerce_default_address_fields', function ( $fields ) { if ( ! is_checkout() ) return $fields; $user_country = WC()->customer->get_billing_country(); $africanCountries = ['DZ','AO','BJ','BW','BF','BI','CM','CV','CF','TD','KM','CG','CD','DJ','EG','GQ','ER','ET','GA','GM','GH','GN','GW','CI','KE','LS','LR','LY','MG','MW','ML','MR','MU','MA','MZ','NA','NE','NG','RW','SN','SC','SL','SO','ZA','SS','SD','SZ','TZ','TG','TN','UG','ZM','ZW']; if ( in_array( $user_country, $africanCountries ) ) { $fields['postcode']['required'] = false; } return $fields; } );
测试说明
添加代码后清空站点缓存、浏览器缓存,再切换喀麦隆、加纳等国家测试,邮编字段的必填星标会消失,提交订单时也不会触发邮编必填报错。
内容的提问来源于stack exchange,提问作者Osah Prince
相关产品推荐
相关产品推荐

