根据 Woocommerce 中的购物车商品运费 class 计数更改运费 class

Change shipping class based on cart items shipping class count in Woocommerce

我在使用默认的 WooCommerce 运输 class 设置时遇到问题。我们有一家小型网店,运费为 2 笔。一种用于适合邮箱的产品,另一种不适合。

我们想做一个设置,如果有2个产品有邮箱发货class,那么价格就变成包价了。

现在默认 WooCommerce 只收取 1 倍的邮箱运费 class。

首先,您需要按照下面的屏幕进行运输设置,"Flat rate" 运输方式,并且只有一种运输方式 class 名为 "Mailbox" (设置"Mailbox" 或不送货 class):

所需的金额

So some of your products will have the "Mailbox" shipping class and all others no shipping class. The products without shipping class (No shipping class) will be your "package.

以下代码将删除购物车商品运费 class,如果有不止一件商品具有 "Mailbox" 运费 class:

// Updating cart item price
add_action( 'woocommerce_before_calculate_totals', 'change_change_shipping_class', 30, 1 );
function change_change_shipping_class( $cart ) {
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // HERE define your shipping class SLUG
    $mailbox_shipping_class = 'mailbox';

    $mailbox_count = 0;

    // 1st cart item Loop: Counting "mailbox" shipping classes cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        // Set the new price
        if( $cart_item['data']->get_shipping_class() == $mailbox_shipping_class ) {
            $mailbox_count += $cart_item['quantity'];
        }
    }

    // If there is more than one item we continue
    if( $mailbox_count <= 1 )
        return; // Exit

    // 2nd cart item Loop: Reset the cart items with shipping class "mailbox"
    foreach ( $cart->get_cart() as $cart_item ) {
        if(  $cart_item['data']->get_shipping_class() == $mailbox_shipping_class ){
            $cart_item['data']->set_shipping_class_id('0');
        }
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。

感谢您的代码,效果很好!

我使用了另一个运输 class id,而不是 0。通过检查可以输入费率的页面代码获得了 id。 (它说name="woocommerce_flat_rate_class_cost_58",所以id是58。)那是我的"big parcel" class。这样,它就可以正确导出到我的 mail/label 插件。