【问题标题】:Hide some shipping methods if cart has more than 4 items from specific shipping class如果购物车中有超过 4 个来自特定运输类别的物品,则隐藏一些运输方式
【发布时间】:2020-08-19 20:53:57
【问题描述】:

这是场景:

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

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

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

//如果我们发现shipping class &数量的产品在shipping 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 运输插件”,因此我可以访问他们的“管理运输方式”插件,该插件允许我执行以下操作:

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

我设置的规则如下:

  1. 对于 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, 免费送货:2, request_shipping_quote。

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

我在上面的代码中为我想要定位的产品创建了第三类 182。只有当少于 5 个该类别的商品添加到购物车时,它才应被视为 151 类别。

但如果购物车中添加了 5 件或更多商品,则应视为 150 类。

这是我的两难选择。

潜在解决方案 - 补充:

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

我现在需要做的是取消设置导致冲突的其他两种运输方式(flat_rate:20 和 flat_rate:21),用于相同的运输类别 (182),但这次是购物车中的产品数量为 4或更少 (=

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

在第一次出现时中断(检查)

  1. 对于 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, 免费送货:2, request_shipping_quote。

  1. 对于 182 类 - 未设置:

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

  1. 对于 151 类 - 未设置:

flat_rate:20, flat_rate:21。

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

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

【问题讨论】:

  • 你已经写了什么代码了?请阅读this guide on producing code for a good quality question,然后在您的问题中包含并标记您的代码。干杯!
  • 刚刚更新了代码。这是我目前正在为不同的运输等级运行的,它工作正常。但我不确定如何为我创建的新运输类别添加数量。
  • @LoicTheAztec 我已经更新了代码,但还没有在登台上进行测试。以为我会让你知道。
  • @Joundill 我已经更新了代码,但还没有在登台上进行测试。以为我会让你知道。
  • @Joundill AS OP 在他的问题中提供了相关代码,如果您愿意,可以删除反对票并关闭。

标签: php wordpress woocommerce shipping-method product-quantity


【解决方案1】:

如果特定运输类别的总物品数为 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 文件中。未经测试它应该可以工作。

刷新运输缓存:

  1. 此代码已保存在您的 functions.php 文件中。
  2. 在运输区域设置中,禁用/保存任何运输方式,然后启用返回/保存。

    您已完成,您可以对其进行测试。

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

替换:

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

通过

$related_total_qty++;

【讨论】:

  • 这很有效,但它似乎与我为其他两个运输类别设置的其他规则发生冲突。我将尝试修改您的代码并将类 ID 替换为产品 ID。只有 7 种产品,所以我要给它一个 bash。感谢您的帮助。
  • @WanderlustConsulting 请在您的问题末尾进行编辑并添加您用于它的代码,然后在完成后通知我......我将合并两者以使其工作。
  • 我刚刚在我最初的问题末尾添加了一条评论。这是一个难题,所以如果还不够清楚,请告诉我。
  • 我已经想出了如何解决这个问题。查看我提出的解决方案的编辑。
猜你喜欢
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2020-08-09
相关资源
最近更新 更多