有条件地更改购物车商品运费 class 以更改 WooCommerce 中的运费

Change conditionally cart item shipping class to change shipping cost in WooCommerce

在 WooCommerce 中,我想根据特定条件从计算运费中排除购物车中的某些产品。在尝试了几个小时的各种方法后,我找不到任何方法来计算剩余产品的运费。

该网店对各种类型的产品使用多种运输方式 class。正在计算各种 class 的运费。当订购了一定数量的特定产品时,这些产品将免运费,但对于购物车中的其他产品,即使与该产品属于同一运费class,仍需要计算运费。免费运送的产品。

我试过的

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

然后我认为解决方案可能是使用 set_shipping_class_id 将购物车中产品实例的运费 class 更新为免运费 class ()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 值添加到对象,但不用于计算运费:原始值仍然存在。

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

我针对这些问题采用了各种解决方案,使用了上面提到的钩子,以及 woocommerce_shipping_rate_cost,但是使用 none 我实现了我在找什么。

有什么方法可以通过编程方式将某些产品排除在计算运费之外,但仍然计算购物车中剩余产品的运费吗?

在您的情况下,woocommerce_cart_shipping_packages 挂钩是用于运费的正确挂钩 class 根据特定条件进行更改,例如:

add_action('woocommerce_cart_shipping_packages', 'alter_item_shipping_class_for_shipping_cost_change' );
function alter_item_shipping_class_for_shipping_cost_change( $shipping_packages ) {
    foreach ( $shipping_packages as $key => $package ) {
        foreach ( $package['contents'] as $cart_item_key => $cart_item ) {
            if ( true ) {
                $package['contents'][$cart_item_key]['data']->set_shipping_class_id(1947);
            }
        }
    }
    return $shipping_packages;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。