You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:06:03