WooCommerce:计算延期交货产品的运费



我需要计算延期订单产品的额外运输成本。我最初想到的是重复每个产品的运费,但这并不准确。所以我想我应该在我的函数中运行另一个函数(与wooccommerce使用的函数相同(来计算购物车中每个和所有延期订单产品的运输成本。

这就是我目前所处的位置。

// Add a extra shipping fee to each backordered product
add_action('woocommerce_cart_calculate_fees', 'add_backorder_shipping_fee', 20, 1);
function add_backorder_shipping_fee($cart)
{
if (is_admin() && !defined('DOING_AJAX'))
return;
$backorderNumber = 0;
// Loop through the cart items (added products).
foreach (WC()->cart->get_cart() as $cart_item) {
// Product Info
$product = $cart_item['data'];
// Quantity of product in cart (being purchased).
$buyingQuantity = $cart_item['quantity'];
if (!empty($product && $product->backorders_allowed())) {
// Calculate if product quantity in cart is more than stock, returns negative if so.
$isBuyingMoreThanStock = $product->stock_quantity - $buyingQuantity;
if ($isBuyingMoreThanStock < 0) {
//!ITEMS: Calculate the number of items are being backordered.
//  $backorderNumber = $backorderNumber + ($isBuyingMoreThanStock * -1);
//!PRODUCTS: Calculate the number of products are being backordered.
$backorderNumber = $backorderNumber + 1;
}
}
}
// Get the shipping cost.
$totalShippingCost = WC()->cart->get_shipping_total() + WC()->cart->get_shipping_tax();
// Calculate and apply the above shipping cost to each backordered item.
$extraShippingFee = $backorderNumber * $totalShippingCost;
// Create the fee.
if ($backorderNumber > 0 && $totalShippingCost > 0) {
$cart->add_fee(__('Backorder Extra Shipping Fee (' . $backorderNumber . ')', 'woocommerce'), $extraShippingFee);
}
}

因此,我不想得到当前的运输成本和延期订购产品数量的倍数,而是想像wooccommerce计算运输成本一样计算额外费用。我想到的另一件事是,我是否也可以将其应用于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(进行运输计算。

最新更新