有条件地更改购物车项目运输类别以更改 WooCommerce 中的运输成本

问题描述

在 WooCommerce 中,我想根据某些条件将购物车中的某些产品排除在计算运费之外。在尝试了各种方式谷歌搜索数小时后,我找不到任何方法来计算仅剩余产品的运费。

该网店为各种类型的产品使用了许多运输类别。各个班级的运费正在累加。订购一定数量的特定产品时,这些产品将免费发货,但对于购物车中的其他产品,即使它们与发货的产品属于同一运输类别,仍然需要计算运费免费。

我的尝试

我的第一个想法是使用 woocommerce_package_rates 过滤器并去除匹配产品的运费。但结果证明这非常复杂,因为我无法计算这些产品的实际运费。此外,购物车中可能还有其他具有相同运输等级的产品。

然后我认为解决方案可能是将购物车中产品实例的运输类别更新为免费运输类别,在添加操作后使用购物车数据上的 set_shipping_class_id() 方法woocommerce_before_calculate_totals 钩子:

add_action('woocommerce_before_calculate_totals','updateShippingClasses',30,1);
function updateShippingClasses($rates) {

    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    foreach (WC()->cart->get_cart() as $cart_item) {
        if (my_condition) {
            $cart_item['data']->set_shipping_class_id(1947); // The Free Shipping class ID.
        }
    }
}

它将“更改后的”shipping_class_id 值添加到对象中,但不用于计算运费:原始值仍然保留。

我在互联网上发现了许多类似的问题,但每次都是关于完全免费送货或更新产品本身的类别。但就我而言,这不是解决方案。

我针对这些问题采用了各种解决方案,使用上述钩子以及 woocommerce_shipping_rate_cost,但没有一个我实现了我想要的。

有没有办法以编程方式从计算运费中排除某些产品,但仍然计算购物车中剩余产品的运费?

解决方法

在您的情况下,sklearn 钩子是用于计算运费的正确钩子,具体取决于基于特定条件的运输等级变化,例如:

woocommerce_cart_shipping_packages

代码位于活动子主题(或活动主题)的functions.php 文件中。经测试有效。