在 WooCommerce 中按商品数量收取本地取件费用

Charge local pickup costs per item quantity in WooCommerce

我这样计算统一运费:x * [qty]

我也想将此方法用于我的 local pickup 方法,但使用上面显示的函数不起作用。

如何实现根据商品数量计算运费?

WordPress:4.8.4 / WooCommerce:3.1.1

Link到页面:http://www.minimoto.me/

更新:

在第一个有用的答案之后,这是我正在使用的代码:

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    ##  -----  1. Hiding shipping methods based on shipping class 92  -----  ##

    // HERE define your shipping class to find
    $class = 92;

    // HERE define the shipping methods you want to hide
    $method_key_ids = array('local_pickup:8');

    // Checking in cart items
    foreach( WC()->cart->get_cart() as $cart_item ){
        // If we find the shipping class
        if( $cart_item['data']->get_shipping_class_id() == $class ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }

    ##  ----- 2. Hiding shipping methods based on shipping class 132  -----  ##

    // HERE define your shipping class to find
    $class = 132;

    // HERE define the shipping methods you want to hide
    $method_key_ids = array('local_pickup:2', 'local_pickup:3', 'local_pickup:4');

    // Checking in cart items
    foreach( WC()->cart->get_cart() as $cart_item ){
        // If we find the shipping class
        if( $cart_item['data']->get_shipping_class_id() == $class ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }

    ##  -------  3. Charge local pickup costs per item quantity  -------  ##

    $cart_items_count = WC()->cart->get_cart_contents_count(); // Cart items count

    // Iterating through Shipping Methods
    foreach ( $rates as $rate_key => $rate ) {
        $method_id = $rate_values->method_id;
        $rate_id = $rate_values->id;

        // For "Local pickup" Shipping" Method only
        if ( 'local_pickup' === $method_id ) {
            if( ! empty( $rates[$rate_id]->cost && $rates[$rate_id]->cost > 0 ) ) {
                // Set the rate calculated cost based on cart items count
                $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cart_items_count, 2);
                // Taxes rate cost (if enabled)
                foreach ($rates[$rate_id]->taxes as $key => $tax){
                    if( $rates[$rate_id]->taxes[$key] > 0 ){ // set the new tax cost
                        $taxes[$key] = number_format( $rates[$rate_id]->taxes[$key] * $cart_items_count, 2 );
                        $has_taxes = true;
                    } else {
                        $has_taxes = false;
                    }
                }
                if( $has_taxes )
                    $rates[$rate_id]->taxes = $taxes;
            }
        }
    }

    return $rates;
}

您可以在 的现有自定义代码中使用挂钩在 woocommerce_package_rates 操作挂钩中的自定义函数。

使用以下代码,您当地的取货运输方式费用将乘以购物车商品总数:

add_filter( 'woocommerce_package_rates', 'customizing_shipping_methods', 10, 2 );
function customizing_shipping_methods( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    ##  -----  1. Hiding shipping methods based on shipping class  -----  ##

    // HERE define your shipping class to find
    $class = 92;

    // HERE define the shipping methods you want to hide
    $method_key_ids = array('flat_rate:7', 'local_pickup:3');

    // Checking in cart items
    foreach( WC()->cart->get_cart() as $cart_item ){
        // If we find the shipping class
        if( $cart_item['data']->get_shipping_class_id() == $class ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }

    ##  -------  2. Charge local pickup costs per item quantity  -------  ##

    $cart_items_count = WC()->cart->get_cart_contents_count(); // Cart items count

    // Iterating through Shipping Methods
    foreach ( $rates as $rate_key => $rate_values ) {
        $method_id = $rate_values->method_id;
        $rate_id = $rate_values->id;

        // For "Local pickup" Shipping" Method only
        if ( 'local_pickup' === $method_id ) {
            if( ! empty( $rates[$rate_id]->cost && $rates[$rate_id]->cost > 0 ) ) {
                // Set the rate calculated cost based on cart items count
                $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cart_items_count, 2);
                // Taxes rate cost (if enabled)
                foreach ($rates[$rate_id]->taxes as $key => $tax){
                    if( $rates[$rate_id]->taxes[$key] > 0 ){ // set the new tax cost
                        $taxes[$key] = number_format( $rates[$rate_id]->taxes[$key] * $cart_items_count, 2 );
                        $has_taxes = true;
                    } else {
                        $has_taxes = false;
                    }
                }
                if( $has_taxes )
                    $rates[$rate_id]->taxes = $taxes;
            }
        }
    }

    return $rates;
}

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。

已测试并有效

Sometimes, you should may be need to refresh shipping methods going to shipping areas, then disable / save and re-enable / save your "flat rate" and "local pickup" shipping methods.