首页 > 解决方案 > 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']
                        ),
                    )
                );
            }
        }
    }

标签: phpwordpresswoocommerceshipping-method

解决方案


当地址字段更改时,我禁用了运输方式的自动 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();
    });

推荐阅读