WooCommerce 问题 calculate_shipping 被调用了 2 次

WooCommerce problems calculate_shipping is called 2 times

我在计算 WooCommerce 中的交付变体时遇到问题。在结帐页面上,我有一个输入地址的字段,并使用 jQuery 和特殊的 api 服务计算城市代码。接下来,向我的 Web 服务发送一个请求,该服务显示所选城市的送货选项。

大多数情况下,这种情况不会中断,但有时不会为同一个城市计算送货选项。我追踪了我的运送方法的 calculate_shipping 函数中发生的事情,结果有时它会因为我不明白的原因被调用 2 次。也就是说,它们会同时调用,并且第一次收到传递选项的 Null 响应时,下一个请求会生成所需的选项。

但 WooCommerce 仅获取第一个 Null 响应并显示一条消息,指出没有可用的选项。如果我刷新页面,选项会正确显示。我还注意到第一次调用calculate_shipping是为了之前的城市代码,也就是在地址为changed.How之前确定并修复了调用calculate_shipping的原因2有时在某些情况下?下面是我的 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();
    });