使用Jquery ajax更新WooCommerce“统一费率”运费

时间:2017-11-29 09:11:25

标签: php ajax wordpress woocommerce shipping

我想在输入地址后更新运费。当客户端开始键入地址时,自动完成功能可帮助客户找到街道名称,建筑物,楼层和侧面。

输入地址后,javascript会计算距离和价格。

然后价格通过ajax发送到shipment.php

我的目标是让货件相应地更新运费。

我试过了:

include '../../../../wp-load.php';

add_action( 'woocommerce_flat_rate_shipping_add_rate','add_another_custom_flat_rate', 10, 2 );
function add_another_custom_flat_rate( $method, $rate ) {
       $new_rate = $rate;
       $new_rate['cost'] = 50; // Update the cost to 50
       $method->add_rate( $new_rate );
     }

但没有运气。

我也遵循本指南并添加了另一种送货方式:Tuts https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098

但是再一次,输入地址后我无法更新价格。

有人可以帮帮我吗?

祝你好运

1 个答案:

答案 0 :(得分:0)

  

我认为您不需要查询ajax直接更新的价格此计算的运费和您不需要您的代码或链接教程中的自定义送货方式。

有三个步骤:

1)在现有的Ajax驱动的PHP函数中,您将在自定义WC_Session属性中设置计算价格,其中$shipping_cost变量将是通过JS Ajax传递的计算运费的收集值:

WC()->session->set( 'shipping_calculated_cost', $shipping_cost );

然后在 jQuery Ajax“成功”事件中,您将使用以下内容更新结帐:

$('body').trigger('update_checkout');

那将刷新结帐数据......

2)在 woocommerce_package_rates 文件管理器挂钩中的自定义函数中,您将获得计算出的运费的会话值...

  

重要提示:在WooCommerce设置中>发货时,您设置 “统一费率”费用为1 ......

在功能代码中,您将设置此固定费率的默认价格(将在运费计算尚不存在时使用):

add_filter('woocommerce_package_rates', 'update_shipping_costs_based_on_cart_session_custom_data', 10, 2);
function update_shipping_costs_based_on_cart_session_custom_data( $rates, $package ){

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    // SET HERE the default cost (when "calculated cost" is not yet defined)
    $cost = '50';

    // Get Shipping rate calculated cost (if it exists)
    $calculated_cost = WC()->session->get( 'shipping_calculated_cost');

    // Iterating though Shipping Methods
    foreach ( $rates as $rate_key => $rate_values ) {
        $method_id = $rate_values->method_id;
        $rate_id = $rate_values->id;

        // For "Flat rate" Shipping" Method only
        if ( 'flat_rate' === $method_id ) {
            if( ! empty( $calculated_cost ) ) {
                $cost = $calculated_cost;
            }
            // Set the rate cost
            $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cost, 2);
            // Taxes rate cost (if enabled)
            foreach ($rates[$rate_id]->taxes as $key => $tax){
                if( $rates[$rate_id]->taxes[$key] > 0 ){ // set the new tax cost
                    $taxes[$key] = number_format( $rates[$rate_id]->taxes[$key] * $cost, 2 );
                    $has_taxes = true;
                } else {
                    $has_taxes = false;
                }
            }
            if( $has_taxes )
                $rates[$rate_id]->taxes = $taxes;
        }
    }
    return $rates;
}

代码进入活动子主题(或活动主题)的function.php文件或任何插件文件中。

3)刷新送货缓存(有时需要)

  
      
  • 首先清空你的购物车。
  •   
  • 此代码已保存在您的function.php文件中。
  •   
  • 进入送货区设置并禁用一个“统一费率”(例如)和“保存”。然后重新启用“统一费率”和“保存”。 您已完成,可以对其进行测试。
  •   

这应该对你有用,

  

如果您通过发货区域有多个不同的“统一费率”,则需要对我的代码进行一些更改,如果每个的默认费用不同...