php - WooCommerce 问题 calculate_shipping 被调用 2 次
问题描述
我在 WooCommerce 中计算交付变量时遇到问题。在结帐页面上,我有一个输入地址的字段,并使用 jQuery 和特殊的 api 服务计算城市代码。接下来,向我的 Web 服务发送一个请求,该服务显示所选城市的交付选项。
大多数情况下,这种情况不会中断,但有时不会为同一个城市计算交付选项。我跟踪了我的运输方法的 calculate_shipping 函数中发生的事情,结果发现有时由于我不明白的原因它被调用了 2 次。也就是说,它们同时被调用,并且第一次收到针对交付选项的 Null 响应,下一个请求会产生所需的选项。
但是 WooCommerce 只获取第一个 Null 响应并显示一条消息,指出没有可用的选项。如果我刷新页面,选项会正确显示。我还注意到,第一次调用calculate_shipping是针对之前的城市代码,即在地址更改之前。如何确定和修复某些情况下调用2次calculate_shipping的原因?下面是我的 calculate_shipping 方法的代码。
public function calculate_shipping( $package = array() ) {
$to_postcode = !empty($package['destination']['postcode']) ? $package['destination']['postcode'] : '000000';
$dimensions = $this->set_package($package);
$delivery_fias_code = $package['destination']['fias_code'];
$delivery_params = [
'aoguid' => $delivery_fias_code,
'postalcode' => empty($delivery_fias_code) ? $to_postcode : '000000',
'weight' => $dimensions['weight'],
'width' => $dimensions['width'],
'length' => $dimensions['length'],
'height' => $dimensions['height'],
'declared' => $package['cart_subtotal'],
'topay' => 0,
'showmode' => 0,
'owner_id' => 55688//get_option('wcopt_login')
];
$deliveryVariants = null;
$deliveryVariants = $this->get_delivery_variants($delivery_params);
if ($deliveryVariants)
$deliveryVariants = json_decode($deliveryVariants, 1);
if ($deliveryVariants != null) {
foreach ($deliveryVariants as $deliveryVariant) {
$this->add_rate(
array(
'id' => $deliveryVariant['Tariff_id'],
'label' => !($deliveryVariant['MinDays'] == $deliveryVariant['MaxDays']) ? $deliveryVariant['TariffName'] . ' (от ' . $deliveryVariant['MinDays'] . ' до ' . $deliveryVariant['MaxDays'] . ' дней)' : $deliveryVariant['TariffName'] . ' (' . $deliveryVariant['MinDays'] . ' дней)',
'cost' => $deliveryVariant['Cost'] + $deliveryVariant['Insurance'],
'package' => $package,
'meta_data' => array(
'tariff_id' => $deliveryVariant['Tariff_id'],
'DeliveryMode' => $deliveryVariant['DeliveryMode']
),
)
);
}
}
}
解决方案
当地址字段更改时,我禁用了运输方式的自动 WooCommerce 更新,并且仅在通过我的方法调用时才保留更新。我使用了下面的代码:
var $checkout_form = $( 'form.checkout' );
$checkout_form.on( 'change', '.address-field select', function(e){
e.stopImmediatePropagation();
});
$checkout_form.on( 'change', '.address-field input.input-text, .update_totals_on_change input.input-text', function(e){
e.stopImmediatePropagation();
});
$checkout_form.on( 'keydown', '.address-field input.input-text, .update_totals_on_change input.input-text', function(e){
e.stopImmediatePropagation();
});
推荐阅读
- go-ethereum - 如何分叉以太坊(去实现)来创建一个新链?
- python - 如何将包含不同长度数组的数组转换为张量?
- react-native - NullPointerException:试图调用虚拟方法'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable
- android - 如何在android中将着色器设置为xml中的路径?
- c# - 重载和覆盖问题
- google-bigquery - 如何使用 DLP 扫描 BigQuery 表以查找敏感数据?
- java - 如何捕获“无法反序列化对象”。Java(Android)中的异常?
- angular - 尝试使用 forRoot() 为延迟加载的组件延迟加载 Angular Material 相关的自定义模块不起作用
- android - 如何解决:com.android.builder.internal.aapt.v2.Aapt2Exception:Android 资源链接失败
- angular - 如何在将日期对象转换为角度即时类型时忽略时间戳