【问题标题】:Unsetting WooCommerce shipping method based on cart items shipping classes根据购物车物品运输类别取消设置 WooCommerce 运输方式
【发布时间】:2017-07-12 22:29:06
【问题描述】:

仅当购物车中的产品同时包含和不包含运费等级时,我才尝试取消设置统一费率配送方式。如果购物车中的所有产品都有运输等级,那么它应该保留。

有这种送货方式:统一费率 - (flat_rate1) (instance_id=1)

还有这些运输等级:50、100 等等,以同样的方式命名 Slugs:50、100……

统一费率运输方式为这些运输类别设置了成本,未设置此方法的主要成本和无运输类别成本,因此它仅显示在购物车中设置了运输类别的产品。

搞定了

add_filter( 'woocommerce_package_rates', 'unset_shipping_for_unmatched_items', 100, 2 );

function unset_shipping_for_unmatched_items( $rates, $package ) {
    // Initialisation
    $shipping_classes = array( 50, 100, 150, 200, 250, 300 );
    $cart_items = WC()->cart->get_cart();
    $cart_items_count = WC()->cart->get_cart_contents_count();

    $items_match = false;

    $inArray    = 0;
    $notInArray = 0;

    foreach( $cart_items as $cart_item ){
        if( in_array( $cart_item[ 'data' ]->get_shipping_class(), $shipping_classes ) && $cart_items_count > 1 ) {
            $inArray++;
        } else {
            $notInArray++;
        }
    }
    if( ( $cart_items_count == $notInArray ) || ( $cart_items_count == $inArray ) ){
        $items_match = false;
    } else {
        $items_match = true;
    }

    if( $items_match )
        unset( $rates['flat_rate:6'] );

    return $rates;
}

【问题讨论】:

    标签: php wordpress woocommerce cart shipping


    【解决方案1】:

    在 WooCommerce 中,运输方式 ID slug 略有不同,我的意思是存在拼写错误。您需要在 slug 中的名称和号码之间添加 ::'flat_rate6'。

    此外,一旦您获得匹配的购物车商品运输类别,您就可以break 循环。
    最后一件事:这个钩子有 2 个可用的参数:$rates 和 $package。

    所以你的代码将是:

    add_filter( 'woocommerce_package_rates', 'hide_shipping_when_class_is_in_cart', 100, 2 ); 
    function hide_shipping_when_class_is_in_cart( $rates, $package ) {
        // Initialisation
        $shipping_classes = array( 50, 100, 150, 200, 250, 300 );
        $class_exists = false;
    
        foreach( WC()->cart->get_cart() as $cart_item )
            if( in_array( $cart_item[ 'data' ]->get_shipping_class_id(), $shipping_classes ) ) {
                $class_exists = true;
                break; // Stop the loop
            }
    
        if( $class_exists ) 
            unset( $rates['flat_rate:6'] );
    
        return $rates;
    }
    

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

    现在应该可以了。

    【讨论】:

    • 得到它的工作,需要使用 get_shipping_class() 来代替在数组中使用它来获得 slug。还有一些计数来检查项目类是否与运输类数组匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多