【问题标题】:Conditionally Hide WooCommerce Shipping methods based on shipping class根据运输类别有条件地隐藏 WooCommerce 运输方法
【发布时间】:2019-07-02 20:08:24
【问题描述】:

This site (here) (WP v4.9) 上使用 WooCommerce v3.2.4 和 11 种运输类别为超重/超大且适用统一费率的产品:
$20 至加拿大和 $25 到美国。

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

如果购物车中有任何超重/超大商品,我的客户希望禁用免费送货。问题在于,当购物车中混合有常规商品和大件商品且未应用任何运输方式时,购物车显示没有可用的运输方式。

我正在使用XAdapter Woocommerce Shipping Table Rate 插件将更高的成本应用于“超重”运输类别。

更新

我停用了这个插件,因为我意识到我可以使用 WooCommerce Shipping Zone 设置为特定的运输类别设置统一费率。请看下面的截图:

我正在使用一些代码来:

  • 当购物车中存在“超重”运输类别时隐藏免费送货和统一费率
  • 如果该类不存在,则隐藏“超重”运输方法(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 列表:

加拿大

  • 定期统一费率 |编号:flat_rate:1
  • 免运费 |编号:free_shipping:3
  • 本地取货 |编号:local_pickup:4

美国

  • 定期统一费率 |编号:flat_rate:2
  • 免运费 |编号:free_shipping:5

【问题讨论】:

标签: php wordpress woocommerce cart shipping


【解决方案1】:

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

以下功能将始终显示加拿大的“本地取货”运输,并且会:

  1. 当“超大”运输类别在购物车中时隐藏免费运输方式。对于“统一费率”运输方式,费用将为“大件”运输类别的一套。
  2. 如果购物车商品中未设置“超大”运输等级:
    • 如果购物车金额小于目标免运费金额:隐藏“免运费”。
    • 如果购物车金额超过目标免费送货金额:隐藏“统一费率”送货方式。

代码如下:

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) 进入运输区域设置并禁用一个“统一费率”(例如) 和“保存”。然后重新启用“统一费率”和“保存”。 您已完成,您可以对其进行测试。

【讨论】:

  • 非常感谢您的回答。我已经实现了该功能,但对其进行了测试,如果我混合了大件物品和普通物品,它现在只显示本地取货。如果它存在于购物车中,我需要它仅显示超大费率,如果在加拿大运输区,我需要它来显示本地取货。有什么想法吗?越来越近了。
  • 其实即使我的购物车里只有大件的商品,它也只会显示本地取货。
  • 我已将我的 ID 列表添加到问题的末尾。非常感谢你帮助我!我非常感激。这几天我一直在扯头发,哈哈。
  • @TheHatchery 我已经重新测试并更新了代码......现在这对你的情况很有效......试试吧,让我知道。
  • 我更新了我的问题以反映我不再使用 XAdapter 插件 - 只是 WooCommerce 运输设置和上面的代码!现在完美运行。非常感谢@LoicTheAztec:D
【解决方案2】:

这可以通过使用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

【讨论】:

    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 2021-02-17
    • 2018-07-10
    • 2020-08-25
    • 1970-01-01
    • 2021-09-19
    • 2019-08-10
    相关资源
    最近更新 更多