当前位置: 首页 > 知识库问答 >
问题:

如果装运类别适用于WooCommerce中的所有购物车项目,则取消装运费率

葛烨
2023-03-14

如果购物车中的所有产品都具有指定的装运类别,我希望所有这些装运费率都不设置,如果购物车中的任何产品具有指定的装运类别,我已设法实现的规则将删除这些费率-我已尝试,正如您将在下面看到的那样。

以下是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;

}

共有1个答案

山高峰
2023-03-14

更新(更正了一些错误)

您应该尝试以下方法,在那里我寻找一个没有运输类的项目。我还重新访问并压缩了您的代码:

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

代码进入函数。活动子主题(或活动主题)的php文件。

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

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

答案基于:隐藏woocommerce中特定装运类别的装运方法

 类似资料:
  • 我写的函数应该检查是否有在购物车的项目,其中有一个特定的类别。 我的想法是: 我猜,get_cart()函数将返回购物车的内容,我将能够从中获取有关商品类别的信息。我需要知道get_cart()返回数组的结构,所以我写了: 得到 然后,我尝试在get_cart()函数的结果中查找类别名称: 得到了同样的错误。 使用$woocommerce而不是WC()不会产生任何效果,也不会删除 我做错了什么?我

  • 真实的例子:一位顾客在购物车中购买了以下产品: 产品A,重量:0.2kg,数量:2,装运类别:免费装运 我的客户使用的是一个表费率运输插件,它只能通过使用购物车内容总重量计算运输成本,在这种情况下,它是3.0kg。 但真正的可充电重量只有2.6公斤... 已经到处搜索,找不到任何函数来计算特定装运类别的购物车项目重量小计,因此我们刚刚起草了以下函数,但它似乎不起作用。有人能帮助改进这个功能吗?

  • 问题内容: 我有上面的代码。 如果我在cart_item上运行print_r,我将得到一个多维数组: 我如何只获得product_id? 我试过$ test = 没用 问题答案: 要获取 foreach循环中的每个购物车商品(对于简单产品): 如果是可变产品,请获取 : 或在两种情况下 ( Woocommerce 3+中 的 Object在哪里) : 更新: 循环外使用产品ID 1)打破循环 (仅

  • 我写了一个函数,当每个产品中的附加字段(在购物车中显示)还没有完成(字段仅在购物车中有2个以上的项目时才出现)时,禁用ordering按钮。 但它只在浏览器中刷新页面时才起作用。 每次在分配给产品的文本字段中输入一些东西,并且带有order按钮的部分将用Ajax刷新时,我如何使函数刷新? 下面是负责添加注释的代码: 保存在文件名(自定义文件)下的Javascrit代码: 保存在活动主题文件中的PH

  • 我在基于WooCommerce的网站上工作。我在里面有很多产品,所有产品都被分配到不同的产品类别。 现在,我有一个要求,完全删除一个类别的产品,如“woo猫”。 有许多自定义插件和主题,在其中有条件地使用该类别的id/slg,所以我决定不删除类别,该类别的产品或该类别的相关代码。 但我重定向每一个可能出现的URL到商店页面中的类别是包括 像我重定向-单页的产品,类别列表页,也隐藏从现场搜索等。。。

  • WooCommerce的购物车数据存储在两个地方,一个是woocommerce_sessions数据表,另一个是在usermeta中,meta key是woocommerce_persistent_cart_[blog ID],blog ID指multisite的site ID。本文介绍查看所有用户购物车的方法,当然,是用程序读取。 查看所有用户购物车的代码 从wp_woocommerce_ses

  • 问题内容: 我正在为wordpress创建一个自定义woocommerce集成主题。 我在顶部有一个Blob,用于显示购物车中的商品总数。我想使用Jquery更新此Blob(不重新加载页面),因此能够通过获取当前商品中的商品数量来增加商品数量blob,并为每次点击将其增加+1,问题是“添加到购物车”具有一个选项,可以选择要添加到购物车的商品数量。因此,如果我选择3个项目并单击按钮,则斑点仅增加1。

  • 问题内容: 我正在尝试使用以下功能更改购物车中的产品价格: 它在WooCommerce版本2.6.x中正常运行,但在版本3.0+中不再正常运行 如何使其在WooCommerce 3.0+版中正常工作? 谢谢。 问题答案: 更新 (2018年9月) 使用 WooCommerce 3.0+版本, 您需要: 要改用 钩子。 要改用WC_Cart 方法 改用WC_product 方法 这是代码: 该代码在