✅ Hides usps_simple:GROUND_ADVANTAGE when product ID 2133 is in the cart.
✅ Shows only free shipping when all products in the cart belong to shipping class 61.
✅ Hides free shipping if there are mixed products (both free and non-free shipping items).
✅ Ensures free shipping stays hidden if it’s not available.
add_filter( 'woocommerce_package_rates', 'c2code_control_shipping_methods', 9999, 2 );
function c2code_control_shipping_methods( $rates, $package ) {
$shipping_class_target = 61; // Target shipping class ID
$restricted_product_id = 2133; // Product ID to check
$restricted_shipping_method = 'usps_simple:GROUND_ADVANTAGE'; // Shipping method to hide
$free_shipping_key = '';
$has_target_class = false;
$has_other_class = false;
$has_restricted_product = false;
// Check all products in the cart
foreach ( WC()->cart->get_cart_contents() as $values ) {
$product_id = $values['product_id'];
$product_shipping_class = $values['data']->get_shipping_class_id();
if ( $product_id == $restricted_product_id ) {
$has_restricted_product = true;
}
if ( $product_shipping_class == $shipping_class_target ) {
$has_target_class = true;
} else {
$has_other_class = true;
}
// If both types are found, no need to check further
if ( $has_target_class && $has_other_class ) {
break;
}
}
// Find free shipping method key
foreach ( $rates as $key => $rate ) {
if ( strpos( $key, 'free_shipping' ) !== false ) {
$free_shipping_key = $key;
}
}
// Hide restricted shipping method if product ID 2133 is in cart
if ( $has_restricted_product && isset( $rates[$restricted_shipping_method] ) ) {
unset( $rates[$restricted_shipping_method] );
}
// Show only free shipping if all products are from the target shipping class
if ( $has_target_class && !$has_other_class && $free_shipping_key ) {
return array( $free_shipping_key => $rates[$free_shipping_key] );
}
// Hide free shipping if mixed products exist
if ( $has_other_class && $free_shipping_key ) {
unset( $rates[$free_shipping_key] );
}
return $rates;
}
Jagdish Sarma Asked question March 6, 2025