有条件地隐藏WooCommerce运输方法基于运输类

时间:2017-11-19 00:20:00

标签: php wordpress woocommerce cart shipping

This site (here)(WP v4.9)上使用WooCommerce v3.2.4,以及11种产品类别为Overweight / Oversize并且适用于固定费率的产品:
$ 20 加拿大, $ 25 到美国。

所有其他产品的统一运费 $ 10 (加拿大)和 $ 15 (美国),除非订单超过 $ 100 ,然后免费送货自动运送。

如果购物车中有超重/超大商品,我的客户希望免费送货。问题是购物车说购物车中有常规商品和超大商品混合使用时没有可用的运输方式,也没有采用运输方式。

我使用XAdapter Woocommerce Shipping Table Rate插件将更高的费用应用于"超重"送货课程。

更新

我已停用此插件,因为我意识到我可以使用WooCommerce Shipping Zone设置为特定的运费类别设置统一费率。见下面的截图: Flat Rate Settings for one of my shipping zones

我正在使用一些代码:

  • 隐藏免费送货和固定费率,当超重"超重"装运等级存在于购物车
  • 隐藏"超重"如果该类不存在的运输方法(163是运输类的ID) ......

以下是代码:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package){
    $hide_when_shipping_class_exist = array(
        163 => array(
            'flat_rate:1',
            'flat_rate:2',
            'free_shipping:3',
            'free_shipping:5'
        )
    );

    $hide_when_shipping_class_not_exist = array(
        163 => array( 'wf_woocommerce_shipping_pro:overweightoversizeoverweight')
    );

    $shipping_class_in_cart = array();
    foreach(WC()->cart->cart_contents as $key => $values) {
       $shipping_class_in_cart[] = $values['data']->get_shipping_class_id();
    }

    foreach($hide_when_shipping_class_exist as $class_id => $methods) {
        if(in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }

    foreach($hide_when_shipping_class_not_exist as $class_id => $methods) {
        if(!in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }
    return $available_shipping_methods;
}

修改

以下是每个送货区的费率ID列表:

加拿大

  • 常规统一费率| ID:flat_rate:1
  • 免费送货| ID:free_shipping:3
  • 本地取件| ID:local_pickup:4

USA

  • 常规统一费率| ID:flat_rate:2
  • 免费送货| ID:free_shipping:5

2 个答案:

答案 0 :(得分:2)

更新2: (无需任何插件,只需设置和代码)

以下功能将始终显示" Local pickup"加拿大航运和意志:

  1. 隐藏免费送货方式" Oversize"运输类是购物车项目。对于"统一费率"运输方式,成本将是" Oversize"运输类。
  2. if" Oversize"装运等级未在购物车中设置:
    • 如果购物车金额低于目标免费送货金额:隐藏"免运费"。
    • 如果购物车金额超过目标免费送货金额:隐藏"统一费率"运输方式。
  3. 以下是代码:

    add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);
    function wf_hide_shipping_method_based_on_shipping_class($rates, $package){
    
        // Defining & Initializing variables
        $free_shipping_rates = array(
            'free_shipping:3',
            'free_shipping:5'
        );
    
        // Defining & Initializing variables
        $shipping_class_id = 163;
        $free = array();
        $over_found = $has_free = false;
    
        // Check if "Oversize" shipping class (163) is in cart items
        foreach(WC()->cart->get_cart() as $key => $cart_item){
            if($cart_item['data']->get_shipping_class_id() == $shipping_class_id ){
                $over_found = true;
                break;
            }
        }
    
        // 1. Hiding free shipping but always show Local pickup for Canada
        if( $over_found ){
            foreach($free_shipping_rates as $rate_id) {
                unset( $rates[$rate_id] );
            }
        }
        // 2. Hiding Flat rate OR Free shipping --> depending on cart amount
        //   (but always show Local pickup for Canada)
        else {
            foreach ( $rates as $rate_id => $rate ) {
    
                // Hide all "Flat rates" when "Free Shipping" is available
                if ( 'free_shipping' === $rate->method_id ) {
                    $free[ $rate_id ] = $rate;
                    $has_free = true;
                } elseif ( 'local_pickup' === $rate->method_id ) {
                    $free[ $rate_id ] = $rate;
                }
            }
            return $has_free ? $free : $rates;
        }
        return $rates;
    }
    

    代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

    在WooCommerce 3上测试并正常工作。

      

    刷新送货缓存(有时需要)
      1)首先清空你的购物车。
      2)此代码已保存在function.php文件中。
      3)进入送货区设置并禁用一个"固定费率" (例如)和"保存"。然后重新启用"统一费率"并且"保存"。 您已完成,可以对其进行测试。

答案 1 :(得分:0)

这可以通过使用Woocommerce Shipping Table Rate来实现,您只需添加额外的规则。您需要添加7条运输规则,您可以在下图中看到运输规则: Image contains the shipping rule you need to add

对于上述规则,您将在购物车页面上获得所需的结果。我已附上不同情况下购物车页面的一些屏幕截图,供您参考: 注意:帽子的运输类别:常规和连帽衫:超重。

Regular and overweight product ordered together

Over wight product with orders over $100

Free shipping for orders amount over $100 with regular items