增加WooCommerce购物车中每个类别计数的运输成本

问题描述

我正在尝试根据购物车中的类别数(计数)来增加运输成本。到目前为止,我有这个:

add_filter( 'woocommerce_package_rates','vh_wc_shipping_costs',20 );

function vh_wc_shipping_costs( $rates ) {
    $increase_cost = 50;
    $cat_ids       = array();
    $count         = 0;

    foreach ( wc()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $cat_ids = array_merge(
            $cat_ids,(array) $cart_item['data']->get_category_ids()
        );
        $count   = count( $cat_ids );
    }

    $i=0;

    if ( $count >= 1 ) {
        foreach ( $rates as $rate_key => $rate ) {
            $i++; $i <= $count;

            // Excluding free shipping methods
            if ( 'free_shipping' !== $rate->method_id ) {
                // Get old cost
                $old_cost = $rates[ $rate_key ]->cost;

                // Set rate cost
                $rates[ $rate_key ]->cost = $old_cost + $increase_cost;
            }
        }
    }

    return $rates;
}

但是由于某种原因,它不会增加每个额外类别的运输成本。另外,我想在这笔额外费用中添加注释。任何建议表示赞赏。

解决方法

由于StackOverFlow上的规则当时只是一个问题,我只会回答与您的代码有关的第一个问题。

以下代码将为购物车中找到的每个其他产品类别增加一个额外的运输费用(因此第一个产品除外):

add_filter( 'woocommerce_package_rates','filter_shipping_rates_costs',10,2 );
function filter_shipping_rates_costs( $rates,$package ) {
    $step_cost = 50;
    $term_ids  = array();

    // Loop through cart items for the current shipping package
    foreach( $package['contents'] as $cart_item ){
        $term_ids = array_merge(
            $term_ids,(array) $cart_item['data']->get_category_ids()
        );
    }

    $terms_count = count( $term_ids );

    // Loop through shipping rates
    foreach ( $rates as $rate_key => $rate ) {
        // Excluding free shipping methods
        if ( 'free_shipping' !== $rate->method_id && $terms_count > 1 ) {
            // Set rate cost
            $rates[$rate_key]->cost = $rate->cost + ($step_cost * ($terms_count - 1));
        }
    }

    return $rates;
}

现在,如果您要为购物车中找到的每个类别添加额外的运输费用,请使用以下命令:

add_filter( 'woocommerce_package_rates',(array) $cart_item['data']->get_category_ids()
        );
    }

    $terms_count = count( $term_ids );

    // Loop through shipping rates
    foreach ( $rates as $rate_key => $rate ) {
        // Excluding free shipping methods
        if ( 'free_shipping' !== $rate->method_id && $terms_count > 0 ) {
            // Set rate cost
            $rates[$rate_key]->cost = $rate->cost + ($step_cost * $terms_count);
        }
    }

    return $rates;
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试,可以正常工作。

刷新发货缓存:

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...