【问题标题】:Unsetting shipping rates if a shipping class applies to all cart items in WooCommerce如果运输类别适用于 WooCommerce 中的所有购物车项目,则取消设置运费
【发布时间】:2018-01-30 15:03:39
【问题描述】:

如果购物车中的所有产品具有指定的运费等级,我希望取消所有这些运费,我已设法实施该规则如果购物车中的任何产品具有指定的运输等级,则删除费率 - 我已经尝试过,如下所示。

这里是工作的 php:

//ROYAL MAIL ONLY FOR SPECIFIC PRODUCTS

add_filter( 'woocommerce_package_rates',     'hide_table_shipping_for_shipping_class', 10, 2 );

function hide_table_shipping_for_shipping_class( $rates, $package ) {
$shipping_class_target = 137; 
$in_cart = false;
foreach( WC()->cart->cart_contents as $key => $values ) {

if( $values[ 'data' ]->get_shipping_class_id() === $shipping_class_target ) {
  $in_cart = true;
  break;
 } 
}
if( $in_cart ) {
 unset( $rates['mh_wc_table_rate_plus_85'] );
 unset( $rates['mh_wc_table_rate_plus_1' ] );
 unset( $rates['mh_wc_table_rate_plus_2' ] );
 unset( $rates['mh_wc_table_rate_plus_3' ] );
 unset( $rates['mh_wc_table_rate_plus_4' ] );
 unset( $rates['mh_wc_table_rate_plus_5' ] );
 unset( $rates['mh_wc_table_rate_plus_6' ] );
 unset( $rates['mh_wc_table_rate_plus_7' ] );
 unset( $rates['mh_wc_table_rate_plus_8' ] );
 unset( $rates['mh_wc_table_rate_plus_9' ] );
 unset( $rates['mh_wc_table_rate_plus_10' ] );
 unset( $rates['mh_wc_table_rate_plus_11' ] );
  unset( $rates['mh_wc_table_rate_plus_12' ] );
  unset( $rates['mh_wc_table_rate_plus_13' ] );
  unset( $rates['mh_wc_table_rate_plus_14' ] );
  unset( $rates['mh_wc_table_rate_plus_15' ] );
  unset( $rates['mh_wc_table_rate_plus_16' ] );
  unset( $rates['mh_wc_table_rate_plus_18' ] );
 unset( $rates['mh_wc_table_rate_plus_19' ] );
  unset( $rates['mh_wc_table_rate_plus_20' ] );
  unset( $rates['mh_wc_table_rate_plus_21' ] );
  unset( $rates['mh_wc_table_rate_plus_22' ] );
  unset( $rates['mh_wc_table_rate_plus_23' ] );
  unset( $rates['mh_wc_table_rate_plus_24' ] );
  unset( $rates['mh_wc_table_rate_plus_25' ] );
  unset( $rates['mh_wc_table_rate_plus_26' ] );
  unset( $rates['mh_wc_table_rate_plus_27' ] );
  unset( $rates['mh_wc_table_rate_plus_28' ] );
  unset( $rates['mh_wc_table_rate_plus_29' ] );
  unset( $rates['mh_wc_table_rate_plus_30' ] );
  unset( $rates['mh_wc_table_rate_plus_31' ] );
  unset( $rates['mh_wc_table_rate_plus_32' ] );
  unset( $rates['mh_wc_table_rate_plus_33' ] );
  unset( $rates['mh_wc_table_rate_plus_34' ] );
  unset( $rates['mh_wc_table_rate_plus_35' ] );
  unset( $rates['mh_wc_table_rate_plus_36' ] );
  unset( $rates['mh_wc_table_rate_plus_37' ] );
  unset( $rates['mh_wc_table_rate_plus_38' ] );
  unset( $rates['mh_wc_table_rate_plus_39' ] );
  unset( $rates['mh_wc_table_rate_plus_40' ] );
  unset( $rates['mh_wc_table_rate_plus_41' ] );
  unset( $rates['mh_wc_table_rate_plus_42' ] );
  unset( $rates['mh_wc_table_rate_plus_43' ] );
  unset( $rates['mh_wc_table_rate_plus_44' ] );
  unset( $rates['mh_wc_table_rate_plus_45' ] );
  unset( $rates['mh_wc_table_rate_plus_46' ] );
  unset( $rates['mh_wc_table_rate_plus_47' ] );
  unset( $rates['mh_wc_table_rate_plus_48' ] );
  unset( $rates['mh_wc_table_rate_plus_49' ] );
  unset( $rates['mh_wc_table_rate_plus_50' ] );
  unset( $rates['mh_wc_table_rate_plus_51' ] );
  unset( $rates['mh_wc_table_rate_plus_52' ] );
  unset( $rates['mh_wc_table_rate_plus_53' ] );
  unset( $rates['mh_wc_table_rate_plus_54' ] );
  unset( $rates['mh_wc_table_rate_plus_55' ] );
  unset( $rates['mh_wc_table_rate_plus_56' ] );
  unset( $rates['mh_wc_table_rate_plus_57' ] );
  unset( $rates['mh_wc_table_rate_plus_58' ] );
  unset( $rates['mh_wc_table_rate_plus_59' ] );
  unset( $rates['mh_wc_table_rate_plus_60' ] );
  unset( $rates['mh_wc_table_rate_plus_61' ] );
  unset( $rates['mh_wc_table_rate_plus_62' ] );
  unset( $rates['mh_wc_table_rate_plus_63' ] );
  unset( $rates['mh_wc_table_rate_plus_64' ] );
  unset( $rates['mh_wc_table_rate_plus_65' ] );
  unset( $rates['mh_wc_table_rate_plus_66' ] );
  unset( $rates['mh_wc_table_rate_plus_67' ] );
  unset( $rates['mh_wc_table_rate_plus_68' ] );
  unset( $rates['mh_wc_table_rate_plus_69' ] );
  unset( $rates['mh_wc_table_rate_plus_70' ] );
  unset( $rates['mh_wc_table_rate_plus_71' ] );
  unset( $rates['mh_wc_table_rate_plus_72' ] );
  unset( $rates['mh_wc_table_rate_plus_73' ] );
  unset( $rates['mh_wc_table_rate_plus_74' ] );
  unset( $rates['mh_wc_table_rate_plus_75' ] );
  unset( $rates['mh_wc_table_rate_plus_78' ] );
  unset( $rates['mh_wc_table_rate_plus_79' ] );
  unset( $rates['mh_wc_table_rate_plus_80' ] );
  unset( $rates['mh_wc_table_rate_plus_81' ] );
  unset( $rates['mh_wc_table_rate_plus_82' ] );
  unset( $rates['mh_wc_table_rate_plus_83' ] );
  unset( $rates['mh_wc_table_rate_plus_84' ] );
  unset( $rates['mh_wc_table_rate_plus_86' ] );
  unset( $rates['mh_wc_table_rate_plus_87' ] );
  unset( $rates['mh_wc_table_rate_plus_88' ] );
  unset( $rates['mh_wc_table_rate_plus_89' ] );
  unset( $rates['mh_wc_table_rate_plus_90' ] );
  unset( $rates['mh_wc_table_rate_plus_91' ] );
  unset( $rates['mh_wc_table_rate_plus_92' ] );
  unset( $rates['mh_wc_table_rate_plus_93' ] );
  unset( $rates['mh_wc_table_rate_plus_94' ] );
  unset( $rates['mh_wc_table_rate_plus_95' ] );
  unset( $rates['mh_wc_table_rate_plus_96' ] );
  unset( $rates['mh_wc_table_rate_plus_97' ] );
  unset( $rates['mh_wc_table_rate_plus_98' ] );
  unset( $rates['mh_wc_table_rate_plus_99' ] );
  unset( $rates['mh_wc_table_rate_plus_100' ] );
  unset( $rates['mh_wc_table_rate_plus_101' ] );
  unset( $rates['mh_wc_table_rate_plus_102' ] );
  unset( $rates['mh_wc_table_rate_plus_103' ] );
  unset( $rates['mh_wc_table_rate_plus_17' ] );
  unset( $rates['mh_wc_table_rate_plus_76' ] );
  unset( $rates['mh_wc_table_rate_plus_77' ] );
}
return $rates;
}

我尝试使用以下方法创建异常:

foreach( WC()->cart->cart_contents as $key => $values ) {
    if( $values[ 'data' ]->get_shipping_class_id() == 0 ) { 
$in_cart = false;
break;
}
elseif( $values[ 'data' ]->get_shipping_class_id() === $shipping_class_target ) {
  $in_cart = true;
  break;
 } 
}
if( $in_cart ) {... etc

这不起作用:(

最终使用 LoicTheAztec 的编辑(谢谢):

add_filter( 'woocommerce_package_rates',              'hide_table_shipping_for_shipping_class', 10, 2 );
function hide_table_shipping_for_shipping_class( $rates, $package ) {

$targeted_class = 137; // <== Your targetted shipping class

// Loop through cart items to find out if any hasn't the targetted shipping class
foreach( WC()->cart->cart_contents as $key => $values ) {
    // IF One item is found without this shipping class
    if( $values[ 'data' ]->get_shipping_class_id() != $targeted_class ) {

##----- This is what I've added, I couldn't make it work in your nice clean format----##
unset( $rates['mh_wc_table_rate_plus_108' ] );
unset( $rates['mh_wc_table_rate_plus_107' ] );
unset( $rates['mh_wc_table_rate_plus_106' ] );
unset( $rates['mh_wc_table_rate_plus_105' ] );
unset( $rates['mh_wc_table_rate_plus_104' ] );

        return $rates; // <== FOUND! We exit returning all Shipping rates
    } 
}

## --------------------- REMOVING SHIPPING METHOD RATES IDS ---------------------- ##
##                 (when all cart items have the targeted shipping class)

// All shipping instance IDs to be removed
$instance_ids = array(
    '1', '2', '3', '4', '5', '6', '7', '8', '9', '10',
    '11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
    '21', '22', '23', '24', '25', '26', '27', '28', '29', '30',
    '31', '32', '33', '34', '35', '36', '37', '38', '39', '40',
    '41', '42', '43', '44', '45', '46', '47', '48', '49', '50',
    '51', '52', '53', '54', '55', '56', '57', '58', '59', '60',
    '61', '62', '63', '64', '65', '66', '67', '68', '69', '70',
    '71', '72', '73', '74', '75', '76', '77', '78', '79', '80',
    '81', '82', '83', '84', '85', '86', '87', '88', '89', '90',
    '91', '92', '93', '94', '95', '96', '97', '98', '99', '100',
    '101', '102', '103',
);

// Loop: Unsetting each shipping method rate Ids
foreach( $instance_ids as $instance_id )
    unset( $rates["mh_wc_table_rate_plus_$instance_id"] );

return $rates;

}

【问题讨论】:

    标签: php wordpress woocommerce cart shipping


    【解决方案1】:

    更新 (更正了一些错误)

    您应该尝试以下方法,我会在其中寻找没有运输等级的物品。我还重新访问并压缩了您的代码:

    add_filter( 'woocommerce_package_rates',     'hide_table_shipping_for_shipping_class', 10, 2 );
    function hide_table_shipping_for_shipping_class( $rates, $package ) {
    
        $targeted_class = 137; // <== Your targetted shipping class
    
        // Loop through cart items to find out if any hasn't the targetted shipping class
        foreach( WC()->cart->cart_contents as $key => $values ) {
            // IF One item is found without this shipping class
            if( $values[ 'data' ]->get_shipping_class_id() != $targeted_class ) {
                return $rates; // <== FOUND! We exit returning all Shipping rates
            } 
        }
    
        ## --------------------- REMOVING SHIPPING METHOD RATES IDS ---------------------- ##
        ##                 (when all cart items have the targeted shipping class)
    
        // All shipping instance IDs to be removed
        $instance_ids = array(
            '1', '2', '3', '4', '5', '6', '7', '8', '9', '10',
            '11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
            '21', '22', '23', '24', '25', '26', '27', '28', '29', '30',
            '31', '32', '33', '34', '35', '36', '37', '38', '39', '40',
            '41', '42', '43', '44', '45', '46', '47', '48', '49', '50',
            '51', '52', '53', '54', '55', '56', '57', '58', '59', '60',
            '61', '62', '63', '64', '65', '66', '67', '68', '69', '70',
            '71', '72', '73', '74', '75', '76', '77', '78', '79', '80',
            '81', '82', '83', '84', '85', '86', '87', '88', '89', '90',
            '91', '92', '93', '94', '95', '96', '97', '98', '99', '100',
            '101', '102', '103',
        );
    
        // Loop: Unsetting each shipping method rate Ids
        foreach( $instance_ids as $id )
            unset( $rates['mh_wc_table_rate_plus_'.$id] );
    
        return $rates;
    }
    

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

    经过测试,它应该适合你。

    有时,您可能需要刷新运输方式
    1) 先清空购物车。
    2) 前往配送区域设置,然后禁用/保存并重新启用/保存相关配送方式。

    答案基于:Hide shipping method for specific shipping classes in woocommerce

    【讨论】:

    • 非常感谢! (特别是为了整理那些乱七八糟的东西!!)但是我很挣扎,因为这似乎撤销了最初的(微小的)成功——当购物车中唯一的物品属于目标运输类别时,它不再删除表格费率?
    • 太棒了!谢谢你:)
    • 是的,完美 - 我已经添加了一些东西(如果这看起来像肉店,我很抱歉!!)在其他运费为时删除目标运费等级的运费可用(我不知道在这里说的最佳方式)我将其添加到我的问题中,因为这里没有足够的空间
    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多