微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WooCommerce:计算延期交货产品的运输成本

如何解决WooCommerce:计算延期交货产品的运输成本

我需要计算延期交货产品的额外运费。我首先想到了重复每个产品的运输成本,但这并不准确。所以我想我应该用我的函数运行另一个函数(与 woocommerce 使用的一样)来计算购物车中每个和所有缺货产品的运费。

这是我目前所在的位置。

library(maps)
library(qdapDictionaries)

list_of_text  <- c('Lorem ipsum 12-01-2021 eat,copenhagen 192.41.196.888','192.41.199.888','Lorem ipsum 12-01-2021,copenhagen www.stackoverflow.com swimming')
#regex needs adjusted. Not extracting the first IP Address
ipRegex   <- "(?(?=.*?(\\d+\\.\\d+\\.\\d+\\.\\d+).*?)(\\1|))"

regmatches(x = list_of_text,m = regexpr(ipRegex,list_of_text,perl = TRUE))[
  regmatches(x = list_of_text,perl = TRUE)) != '']

verbRegex <- substr(paste0((unlist(action.verbs)),'|',collapse = ""),start = 1,nchar(paste0((unlist(action.verbs)),collapse = ""))-1)

unlist(regmatches(x = list_of_text,m = gregexpr(verbRegex,perl = TRUE)) != ''])

citiesRegex <- substr(paste0((unlist(world.cities[world.cities$pop >1000000,'name'])),nchar(paste0((unlist(world.cities[world.cities$pop >1000000,m = gregexpr(citiesRegex,perl = TRUE)) != ''])

因此,我想计算额外费用,就像 woocommerce 计算运输成本一样,而不是根据当前的运输成本和延期交货产品的数量来计算。我想到的另一件事是,我是否也可以将其应用于 Fedex 实时汇率 API。

解决方法

我建议基于 WooCommerce 运费计算方法的替代解决方案。

// Calculate and sum all backorder product shipping fees
add_filter( 'woocommerce_shipping_packages',function ( $packages ) { 

foreach ( $packages as $package_key => &$package ){
    $backorders = array();
    foreach ( $package['contents'] as $cartkey => $values ){
        if ( $values['data']->is_on_backorder() ){
            if ( empty($i) ) $i = 1; else $i++;
            $backorders[ $i ][ $cartkey ] = $values; // Get backorders
        } else {
            $backorders[ 0 ][ $cartkey ] = $values; // Get NOT backorders
        }
    }

    if ( count( $backorders ) <= 1 ) continue; // Break if no backorder

    $tax_rates = WC_Tax::get_shipping_tax_rates();
    $new_packages = array();
    foreach ( $backorders as $i => $backorder ){
        $new_packages[ $i ] = $package;
        $new_packages[ $i ]['contents'] = $backorder;
        $new_packages[ $i ]['contents_cost'] = array_sum( wp_list_pluck( $backorder,'line_total' ) ); // calculate products total
        $new_packages[ $i ] = WC()->shipping()->calculate_shipping_for_package( $new_packages[ $i ] ); // calculate shipping cost
    }

    foreach ( $package['rates'] as $ratekey => &$rate ){
        $rate->cost = 0;
        foreach ( $new_packages as $i => $new_package ){
            if ( empty( $new_package['rates'][$ratekey] ) ) continue;
            $rate->cost += $new_package['rates'][$ratekey]->cost; // sum shipping costs
        }
        $rate->taxes = WC_Tax::calc_tax( $rate->cost,$tax_rates,true ); // re-calculate taxes
        $rate->label = 'Shipped in order'; // change shipping label if you want
    }
}

return $packages;

});

这种方法的优点是它还支持使用 flat_rate 和 table_rate 等运输类计算运费。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。