WooCommerce已存账单地址时返回全量地址未输出address_2问题
问题背景
- 实现目标:若客户此前已录入账单地址(存在历史购买记录,或已在个人账户中保存过地址),则在WooCommerce结账页精简账单地址模块
- 当前异常:功能未按预期运行,未正常输出
address_2字段,始终返回全量账单地址
代码存在的逻辑错误
has_billing()判断函数返回值完全非法
函数内判断邮编、国家字段存在后,返回的是从未声明定义的变量$address_fields['address_2'],PHP运行时会抛出未定义变量警告,实际返回null,导致外层if判断条件恒为假,精简逻辑根本不会触发,因此页面始终加载全量账单地址字段。
额外问题:函数内查询账单地址元数据时,错误使用了$shipping_*前缀命名变量,语义和实际取值不匹配,提高后续维护的出错概率;且判断不通过时无显式返回值,会导致判断逻辑出现非预期匹配。- 账单地址精简逻辑完全不符合需求
现有逻辑一旦判断用户已存地址,就直接unset($fields['billing'])后将其赋值为空数组,相当于直接删除整个账单地址字段组,哪怕判断逻辑正常生效,也会把包括address_2在内的所有账单字段全部隐藏,根本达不到“精简模块、保留address_2字段”的要求。
修正后可用代码
// 已保存有效账单地址时,精简结账页账单地址模块 add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' ); function custom_override_checkout_fields( $fields ) { if( is_user_logged_in() && has_billing() ){ // 按需移除不需要展示的账单字段,保留需要输出的billing_address_2 unset( $fields['billing']['billing_first_name'], $fields['billing']['billing_last_name'], $fields['billing']['billing_company'], $fields['billing']['billing_address_1'], $fields['billing']['billing_city'], $fields['billing']['billing_postcode'], $fields['billing']['billing_country'], $fields['billing']['billing_state'], $fields['billing']['billing_phone'], $fields['billing']['billing_email'] ); } return $fields; } // 校验当前登录用户是否已录入有效账单地址 function has_billing($user_id = false){ if(!$user_id) { $user_id = get_current_user_id(); } // 修正变量命名,与账单地址语义匹配 $billing_postcode = get_user_meta( $user_id, 'billing_postcode', true ); $billing_country = get_user_meta( $user_id, 'billing_country', true ); $billing_address_1 = get_user_meta( $user_id, 'billing_address_1', true ); // 核心账单字段均不为空时,判定为已存有效地址,显式返回true if( !empty($billing_postcode) && !empty($billing_country) && !empty($billing_address_1) ){ return true; } // 不满足条件显式返回false return false; }
可根据实际精简需求,调整unset列表里的字段,不需要隐藏的字段直接从unset中移除即可。
内容的提问来源于stack exchange,提问作者Ava
相关产品推荐
相关产品推荐

