【问题标题】:WooCommerce: Calculate backorder products shipping costWooCommerce:计算延期交货产品的运费
【发布时间】:2021-07-16 21:25:51
【问题描述】:

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

这是我到目前为止的位置。

// 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);
    }
}


因此,我想计算额外费用,就像 woocommerce 计算运费一样,而不是获取当前运费和延期交货产品数量的倍数。想到的另一件事是,如果我也可以将其应用于 Fedex 实时费率 API。

【问题讨论】:

  • 我不太明白你所说的准确的意思,WooCommerce 运费计算不准确吗?
  • 为什么要在开头检查is_admin()?这样,您的功能永远不会在购物车页面上运行,因为购物车页面不是管理仪表板页面。也许您应该在向开发人员提问之前重新考虑您的代码。

标签: woocommerce shipping fedex


【解决方案1】:

我建议基于 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等运费类进行运费计算。

【讨论】:

  • 太棒了。我会试一试。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多