php 有条件地更改购物车项目运输类别,以更改WooCommerce中的运费

iezvtpos  于 2023-01-12  发布在  PHP
关注(0)|答案(1)|浏览(131)

在WooCommerce中,我想根据某些条件,将购物车中的某些产品排除在计算运费之外。在尝试了各种方法和谷歌搜索数小时后,我找不到任何方法来计算运费,只计算剩余产品的运费。
网店为各种类型的产品使用许多运输分类。各种分类的运输成本被加起来。当订购了一定数量的特定产品时,这些产品将被免费运输,但是对于购物车中的其他产品,运输成本仍然需要计算,即使它们与免费运输的产品属于相同的运输分类。
"我所尝试的"
我的第一个想法是使用 woocommerce_package_rates 过滤器,并删除匹配产品的运费。但这是非常复杂的,因为我无法计算这些产品的实际运费。此外,购物车中可能有相同运费等级的其他产品。
然后我想,解决方案可能是在向 woocommerce_before_calculate_totals 钩子添加一个操作之后,使用cart-data上的 set_shipping_class_id() 方法,将cart中产品示例的配送类更新为Free Shipping类:

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.
        }
    }
}

它将“changed”shipping_class_id值添加到对象,但不用于计算运费:原始值仍然保留。
在互联网上我发现了许多类似的问题,但每次都是关于使运费完全免费或更新产品本身的类。但在我的情况下,这不是解决方案。
我采用了各种解决方案来解决这些问题,使用上面提到的钩子,以及 woocommerce_shipping_rate_cost,但没有一个能达到我的目标。
有没有什么方法可以通过编程的方式将一些产品排除在运费计算之外,但仍然计算购物车中剩余产品的运费?

3xiyfsfu

3xiyfsfu1#

在您的情况下,woocommerce_cart_shipping_packages挂钩是根据特定条件(如:

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文件中的活动子主题(或活动主题).测试和作品.

相关问题