WooCommerce 运输插件 - 结帐运费未更新(AJAX)

WooCommerce Shipping Plugin - Checkout Shipping Cost Not Updating(AJAX)

我搜索过任何解决方案,但没有任何效果。

这是我想做的事情:

  1. 在名为 Shipping 的结帐页面中添加新字段,显示为包含 PreorderNon-preorder
  2. 的选择框
  3. 如果 preorder 则将显示 位置 字段显示为选择框
  4. 如果 non-preorder 则将显示 Location 字段与步骤 2 相同但列表选项不同。
  5. ShippingLocation 填写正确时,运费将以正确的运费显示。

问题

当我填写所有必填字段并运费位置运费伤口重新计算。它执行 AJAX 请求,但运费保持不变。

但是,当我更改 姓名街道地址 时,运费会正确更新,这是不良行为。当用户立即点击 下订单 时会 POST 错误的运费。

这里我Youtube Video说清楚我需要什么帮助。


我做了什么来创建我自己的插件:

  1. 使用像这样的钩子创建自定义字段
    public function woocommerce_checkout_fields( $fields )
    {
        // var_dump(have_rows('location', 'option'));
        // die('test');

        $options = [];

        $options[''] = 'Select Shipping';
        $options['pre-order'] = 'Pre Order';
        if (!$this->hasPreorderItem()) {
            $options['non-pre-order'] = 'Non Pre Order';
        }

        // Add custom billing shipping
        $fields['billing']['billing_shipping'] = array (
            'type' => 'select',
            'label' => 'Shipping',
            'placeholder' => 'Select shipping',
            'class' => array ('address-field', 'update_totals_on_change' ),
            'required' => true,
            'options' => $options
            // 'options' => $this->getLocations()
        );

        $fields['billing']['billing_location_pre_order'] = array (
            'type' => 'select',
            'label' => 'Location(Pre Order)',
            'placeholder' => 'Select Preorder Location',
            'class' => array ('address-field', 'update_totals_on_change' ),
            'required' => false,
            'options' => $this->preorderLocations->getLocations()
            // 'options' => $this->getLocations()
        );

        // Add custom billing location
        $fields['billing']['billing_location'] = array (
            'type' => 'select',
            'label' => 'Location',
            'placeholder' => 'Select location',
            'class' => array ('address-field', 'update_totals_on_change' ),
            'required' => false,
            'options' => $this->locations->getLocations()
            // 'options' => $this->getLocations()
        );

        return $fields;
    }
  1. 创建 class 以帮助根据 ShippingLocation.
  2. 计算成本

我试过的

  1. 使用这个答案但没有运气。 Click here 回答问题。
  2. 尝试将字段设置为必填字段,因为我看到有人说只有在所有必填字段都已填满时才会更新。
  3. 试图在 wp-config.php
  4. 中禁用缓存

我从 this link

找到了解决方案

我可能会帮助有类似问题的人。您只需要清除会话。因此,WooCommerce 将重新计算并调用您的 calculate_shipping() 函数。

为此添加 woocommerce_checkout_update_order_review 挂钩。它看起来像这样

add_action('woocommerce_checkout_update_order_review', 'action_woocommerce_checkout_update_order_review', 10, 1);
function action_woocommerce_checkout_update_order_review( $posted_data )
{
    global $woocommerce;
    $packages = $woocommerce->cart->get_shipping_packages();
    foreach( $packages as $package_key => $package ) {
        $session_key  = 'shipping_for_package_'.$package_key;
        $stored_rates = WC()->session->__unset( $session_key );
    }
}