WooCommerce 运输插件 - 结帐运费未更新(AJAX)
WooCommerce Shipping Plugin - Checkout Shipping Cost Not Updating(AJAX)
我搜索过任何解决方案,但没有任何效果。
这是我想做的事情:
- 在名为 Shipping 的结帐页面中添加新字段,显示为包含
Preorder
和 Non-preorder
的选择框
- 如果
preorder
则将显示 位置 字段显示为选择框
- 如果
non-preorder
则将显示 Location 字段与步骤 2 相同但列表选项不同。
- 当 Shipping 和 Location 填写正确时,运费将以正确的运费显示。
问题
当我填写所有必填字段并运费、位置运费伤口重新计算。它执行 AJAX 请求,但运费保持不变。
但是,当我更改 姓名 或 街道地址 时,运费会正确更新,这是不良行为。当用户立即点击 下订单 时会 POST 错误的运费。
这里我Youtube Video说清楚我需要什么帮助。
我做了什么来创建我自己的插件:
- 使用像这样的钩子创建自定义字段
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;
}
- 创建 class 以帮助根据 Shipping 和 Location.
计算成本
我试过的
- 使用这个答案但没有运气。 Click here 回答问题。
- 尝试将字段设置为必填字段,因为我看到有人说只有在所有必填字段都已填满时才会更新。
- 试图在
wp-config.php
中禁用缓存
我从 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 );
}
}
我搜索过任何解决方案,但没有任何效果。
这是我想做的事情:
- 在名为 Shipping 的结帐页面中添加新字段,显示为包含
Preorder
和Non-preorder
的选择框
- 如果
preorder
则将显示 位置 字段显示为选择框 - 如果
non-preorder
则将显示 Location 字段与步骤 2 相同但列表选项不同。 - 当 Shipping 和 Location 填写正确时,运费将以正确的运费显示。
问题
当我填写所有必填字段并运费、位置运费伤口重新计算。它执行 AJAX 请求,但运费保持不变。
但是,当我更改 姓名 或 街道地址 时,运费会正确更新,这是不良行为。当用户立即点击 下订单 时会 POST 错误的运费。
这里我Youtube Video说清楚我需要什么帮助。
我做了什么来创建我自己的插件:
- 使用像这样的钩子创建自定义字段
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;
}
- 创建 class 以帮助根据 Shipping 和 Location. 计算成本
我试过的
- 使用这个答案但没有运气。 Click here 回答问题。
- 尝试将字段设置为必填字段,因为我看到有人说只有在所有必填字段都已填满时才会更新。
- 试图在
wp-config.php
中禁用缓存
我从 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 );
}
}