Woocommerce 3.0+ default_checkout_billing_country过滤器覆盖用户账单国家问题
解决WooCommerce 3.0+中
default_checkout_billing_country覆盖用户已保存账单国家的问题 不少开发者在升级到WooCommerce 3.0之后都会碰到这个头疼的问题:使用default_checkout_billing_country过滤器时,它会强制把结账页面的账单国家设置为你指定的默认值,完全忽略用户账户里已经保存好的账单国家设置。
问题复现步骤
- 在主题的
functions.php文件中添加default_checkout_billing_country过滤器,并设置一个目标默认国家代码; - 登录用户账户,编辑账单地址,选择一个和默认国家不同的国家并保存;
- 把商品加入购物车后进入结账页面,你会发现账单国家被改成了过滤器指定的默认值,而不是你刚才保存的国家。
问题出在哪?
默认的default_checkout_billing_country过滤器逻辑很简单——不管用户有没有保存过地址,直接返回你设置的默认国家代码,这就导致了用户已有的地址被无情覆盖。
修复方案
我们只需要给过滤器的回调函数加个判断逻辑:只有当用户没有保存过账单国家的时候,才应用我们的默认值;如果用户已经有保存的地址,就老老实实保留用户的设置。
把你原来的过滤器代码替换成下面这段(示例中默认国家设为US,你可以改成自己需要的国家代码):
add_filter( 'default_checkout_billing_country', 'custom_default_checkout_billing_country' ); function custom_default_checkout_billing_country( $default_country ) { // 获取当前登录的用户信息 $current_user = wp_get_current_user(); // 检查用户是否登录,且已经保存了账单国家 if ( $current_user->ID && !empty( $current_user->billing_country ) ) { // 返回用户自己保存的账单国家 return $current_user->billing_country; } // 用户没保存过账单国家时,返回我们指定的默认值 return 'US'; }
代码逻辑说明
wp_get_current_user()用来获取当前登录用户的对象;- 先判断用户是否登录,并且
billing_country字段不为空——如果满足这两个条件,就直接返回用户已有的账单国家; - 只有当用户未登录,或者完全没设置过账单地址的时候,才会使用我们指定的默认国家,这样就不会覆盖用户的已有设置了。
内容的提问来源于stack exchange,提问作者Manoj Mohan
相关产品推荐
相关产品推荐

