如果购物车中有超过 4 件来自特定运输的商品,则隐藏一些运输方式 class

Hide some shipping methods if cart has more than 4 items from specific shipping class

场景如下:

我使用 UPS 运输成托盘的饮料。但是,要将 5 托盘的饮料装到盒子里变得非常困难。因此,我想禁用 UPS 运输方式,并且仅在客户订购 5 盘或更多托盘的饮料时才显示 Flat Rate Shipping。我有大约 7 种不同的饮料,但我可以将这些饮料添加到运输中 class 以简化代码。

我想扩展此代码以包含特定 class 中的产品数量,或者可能是运输中 class 中产品出现的次数。因此,如果购物车中有 5 种或更多的产品在此特定运输 class,它应该删除我在数组下指定的运输方式。

如何扩展此代码以包含产品数量?

// 如果我们发现运费class & 运费class中的产品数量等于或大于5.

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Shipping Class To Find
    $class = 182;

    // Number Of Shipping Class Items In Cart
    $amount = 5;

    // Shipping Methods To Hide
    $method_key_ids = array('wf_shipping_ups:07', 'wf_shipping_ups:08', 'wf_shipping_ups:11', 'wf_shipping_ups:54', 'wf_shipping_ups:65', 'wf_shipping_ups:70', 'wf_shipping_ups:74', 'free_shipping:2', 'request_shipping_quote');

    // Checking In Cart Items
    foreach( $package['contents'] as $item ) {
        // If We Find The Shipping Class and Number of Items
        if( $item['data']->get_shipping_class_id() == $class && count($package['contents']) >= $amount ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove Targeted Methods
            }
            break; // Stop The Loop
        }
    }
    return $rates;
}

编辑 - 添加:

自从我从 PluginHive 购买了“WooCommerce UPS Shipping Plugin with Print Label”后,我就可以访问他们的“Manage Shipping Methods”插件,它允许我执行以下操作:

设置多个规则以从各种运输方式中排除各种运输方式 classes。 第一次出现时打断顺序。

我设置的规则如下:

  1. 对于 Class 150(第一次出现时中断)- 未设置:

wf_shipping_ups:07, wf_shipping_ups:08, wf_shipping_ups:11, wf_shipping_ups:54, wf_shipping_ups:65, wf_shipping_ups:70, wf_shipping_ups:74, free_shipping:2, request_shipping_quote.

  1. 对于 Class 151 - 未设置: flat_rate:20, flat_rate:21.

我在上面的代码中为我要定位的产品创建了第三个 class 182。仅当添加到购物车的 class 中的商品少于 5 件时,才应将其视为 class 151。

但如果将 5 件或更多商品添加到购物车,则应视为 Class150。

这是我的困境。

可能的解决方案 - 添加:

我想出了解决问题的方法。如果购物车中的产品数量为 5 件或更多,代码 @LoicTheAztec 帮助我取消给定运输 class 的运输方式。

我现在需要做的是取消设置导致冲突的其他两种送货方式(flat_rate:20 和 flat_rate:21),对于相同的送货方式 class (182) 但是这购物车中产品数量为 4 或更少的时间 (=<)。

然后我可以使用现有的插件创建以下规则:

第一次出现中断(检查)

  1. 对于 Class 150 - 未设置:

wf_shipping_ups:07, wf_shipping_ups:08, wf_shipping_ups:11, wf_shipping_ups:54, wf_shipping_ups:65, wf_shipping_ups:70, wf_shipping_ups:74, free_shipping:2, request_shipping_quote.

  1. 对于 Class 182 - 未设置:

没有 - 因为两个代码都会创建逻辑

  1. 对于 Class 151 - 未设置:

flat_rate:20, flat_rate:21.

这应该可以解决由插件引起的冲突。

百万美元的问题是......我能以某种方式使用@LoicTheAztec 的解决方案来设置某种最小数量吗?

如果来自特定运送 class 的商品总数为 5 件或更多,以下将隐藏特定定义的运送方式:

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package ) {
    $targeted_class_ids = array(182); // Shipping Class To Find
    $allowed_max_qty    = 4; // Max allowed quantity for the shipping class
    $shipping_rates_ids = array( // Shipping Method rates Ids To Hide
        'wf_shipping_ups:07',
        'wf_shipping_ups:08',
        'wf_shipping_ups:11',
        'wf_shipping_ups:54',
        'wf_shipping_ups:65',
        'wf_shipping_ups:70',
        'wf_shipping_ups:74',
        'free_shipping:2',
        'request_shipping_quote'
    );
    
    $related_total_qty  = 0;

    // Checking cart items for current package
    foreach( $package['contents'] as $key => $cart_item ) {
        if( in_array( $cart_item['data']->get_shipping_class_id(), $targeted_class_ids ) ){
            $related_total_qty += $cart_item['quantity'];
        }
    }
    
    // When total allowed quantity is more than allowed (for items from defined shipping classes)
    if ( $related_total_qty > $allowed_max_qty ) {
        // Hide related defined shipping methods
        foreach( $shipping_rates_ids as $shipping_rate_id ) {
            if( isset($rates[$shipping_rate_id]) ) {
                unset($rates[$shipping_rate_id]); // Remove Targeted Methods
            }
        }
    }
    return $rates;
}

代码进入您的活动子主题(或活动主题)的 functions.php 文件。未经测试,它应该可以工作。

Refresh the shipping caches:

  1. This code is already saved on your functions.php file.
  2. In a shipping zone settings, disable / save any shipping method, then enable back / save.

    You are done and you can test it.

处理物品数量而不是物品累计数量:

替换:

$related_total_qty += $cart_item['quantity'];

来自

$related_total_qty++;