WooCommerce结账页如何获取当前收货地址及自定义折扣字段?
结账页面首次加载时订单尚未创建,WC()->order本身就为空,自然无法调用相关方法。可按以下方案安全获取带自定义字段的收货地址:
1. 适配多地址插件的前提说明
你使用的单用户多地址插件,默认会将用户所有保存的地址以序列化数组的形式存在wp_usermeta表中,每个地址会对应唯一的address_id标识,你可以先到数据库中对应当前测试用户的元数据,找到插件存储地址的meta_key备用。
2. 页面首次加载时获取折扣
- 先获取当前登录用户ID:
$user_id = get_current_user_id(); - 读取该用户下所有保存的地址数据:
$user_addresses = get_user_meta( $user_id, '多地址插件的地址存储元键', true ); - 匹配当前默认选中的收货地址ID,直接读取对应地址下你设置的折扣自定义字段值即可,全程不走前端传参,完全避免用户篡改。
3. AJAX切换地址时获取折扣
你的AJAX请求只需传递前端选中的收货地址address_id参数即可,后端按以下逻辑读取折扣:
// 校验登录状态 if ( ! is_user_logged_in() ) { wp_send_json_error( '非法请求' ); } $user_id = get_current_user_id(); // 过滤参数防注入 $target_address_id = sanitize_text_field( $_POST['address_id'] ); // 读取用户所有地址 $user_addresses = get_user_meta( $user_id, '多地址插件的地址存储元键', true ); // 初始化折扣默认值 $discount = 0; // 匹配对应地址的折扣字段 if ( isset( $user_addresses[$target_address_id]['你的折扣字段键名'] ) ) { $discount = floatval( $user_addresses[$target_address_id]['你的折扣字段键名'] ); } // 后续直接用$discount计算即可
4. 简化
WC()->customer调用的适配方案 如果不想直接操作用户元,你可以通过钩子将自定义折扣字段注入到WC客户对象的地址数据中,统一返回结构:
add_filter( 'woocommerce_customer_get_shipping', 'inject_custom_discount_to_shipping_address', 10, 3 ); function inject_custom_discount_to_shipping_address( $address_data, $customer_obj, $context ) { $user_id = $customer_obj->get_id(); $address_id = $address_data['address_id']; // 按实际存储规则读取折扣值 $address_data['custom_discount'] = get_user_meta( $user_id, "shipping_discount_{$address_id}", true ); return $address_data; }
添加钩子后直接调用WC()->customer->get_shipping('custom_discount')即可获取对应折扣,无需处理嵌套层级差异。
内容的提问来源于stack exchange,提问作者coopersita
相关产品推荐
相关产品推荐

