0

我在帐单和送货地址中添加了几个额外的字段。其中之一是折扣,只能由管理员添加(对其他人隐藏)。不同的送货地址有不同的折扣(我使用的是为每个客户保存多个地址的暴跌)。

在结帐期间,我想加载该送货地址的折扣。我正在通过 ajax 调用一个方法(还有其他字段在更改时也会更新运输方式和支付网关),效果很好。对于这些字段,我只是通过 JS 将它们的值传递给 PHP,方法是从表单中获取它们。我不能因为折扣而这样做,因为有人可能只是打开开发人员工具并手动更改折扣。我需要从数据库中获取它。

在卡首次加载时调用的那个方法中,我尝试按如下方式获取地址:

WC()->order->get_address('shipping');

但是我收到一个错误,好像该方法不存在一样。

And WC()->order返回空。

我加载WC()->customer了,我可以在那里看到它,但它隐藏在一些非常深的嵌套对象和数组中,你可以看出这些对象和数组会因客户而异。并且WC()->session只有默认地址字段(不是我的自定义字段)。

有任何想法吗?

4

1 回答 1

0

我最终做的是检查购物车中的 3 个地址,然后加载客户元数据并检查匹配的地址(我找到了用于在元数据中存储额外地址的密钥),然后从该地址获取折扣:

$discount = null;
$address1 = WC()->customer->get_shipping_address_1();
$address2 = WC()->customer->get_shipping_address_2();
$addressCity = WC()->customer->get_shipping_city();
$c = WC()->customer->get_meta('thwma_custom_address');
if (is_array($c)) {
    foreach ($c as $key => $val) {
        if ($key == "shipping") {
            foreach ($val as $v) {
                if (isset($v['dealer_discount']) && $v['shipping_address_1'] == esc_html($address1) && $v['shipping_address_2'] == esc_html($address2) && $v['shipping_city'] == esc_html($addressCity)) {
                    $discount = absint($v['dealer_discount']);
                }
            }
        }
    }
}
于 2021-09-24T14:54:20.750 回答