wordpress 禁用特定的运输方法只有当特定的产品是单独在WooCommerce车

a0x5cqrl  于 5个月前  发布在  WordPress
关注(0)|答案(1)|浏览(80)

我想看看是否有可能禁用所有/特定的运输选项时,一个特定的运输类的产品在购物车.然而,此规则将仅适用于当特定的产品是购物车中的唯一项目.如果任何其他产品存在,然后默认的运输选项将显示.这是我以前使用过的

add_filter( 'woocommerce_package_rates', 'custom_hide_shipping_for_shipping_class', 9999, 2 );
   
function custom_hide_shipping_for_shipping_class( $rates, $package ) {
   $shipping_class_target = 569; // shipping class ID
   $in_cart = false;
   foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
      if ( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
         $in_cart = true;
         break;
      } 
   }
   if ( $in_cart ) {
      unset( $rates['free_shipping:8'] ); // shipping method with ID
   }
   return $rates;
}

字符串
然而,上述代码将工作,尽管其他产品在购物车。我只希望这是工作,如果特定的产品是在购物车中的唯一项目。
上面的代码可以调整吗?或者它需要不同的方法?

tmb3ates

tmb3ates1#

要使其工作,只有当特定的产品是购物车中的唯一项目,尝试以下操作:

add_filter( 'woocommerce_package_rates', 'custom_hide_shipping_for_shipping_class', 900, 2 );
function custom_hide_shipping_for_shipping_class( $rates, $package ) {
    $targeted_shipping_class  = 569; // shipping class ID
    $targeted_shipping_method = 'free_shipping:8'; // shipping method rate ID

    $found = false;

    foreach ( $package['contents'] as $item ) {
        if ( $item['data']->get_shipping_class_id() == $targeted_shipping_class ) {
            $found = true;
        } else {
            return $rates;
        }
    }
    if ( $found && isset($rates[$targeted_shipping_method]) ) {
        unset($rates[$targeted_shipping_method]);
    }
    return $rates;
}

字符串
应该能用
要隐藏多个目标运输方法,请使用以下命令:

add_filter( 'woocommerce_package_rates', 'custom_hide_shipping_for_shipping_class', 900, 2 );
function custom_hide_shipping_for_shipping_class( $rates, $package ) {
    $targeted_shipping_class   = 569; // shipping class ID
    $targeted_shipping_methods = ['free_shipping:8', 'flat_rate:10', 'flat_rate:13']; // Array of shipping methods rate IDs

    $found = false;

    foreach ( $package['contents'] as $item ) {
        if ( $item['data']->get_shipping_class_id() == $targeted_shipping_class ) {
            $found = true;
        } else {
            return $rates;
        }
    }
    if ( $found ) {
        foreach ( $targeted_shipping_methods as $method_rate_id ) {
            if ( isset($rates[$method_rate_id]) ) {
                unset($rates[$method_rate_id]);
            }
        }
    }
    return $rates;
}

相关问题