This PHP code uses a shipping class named sample OR product id 636 to remove all shipping methods excluding free shipping. If you want to give away a free sample and apply free shipping to the sample, use this code in your child themes function file or custom code snippets plugin.
add_filter( 'woocommerce_package_rates', 'disable_flat_rate_for_specific_products', 100, 2 ); function disable_flat_rate_for_specific_products( $rates, $package ) { $disable_flat_rate = false; // Check if any product in the cart has the shipping class "sample" or is product ID 636 foreach ( $package['contents'] as $item_id => $values ) { if ( has_term( 'sample', 'product_shipping_class', $values['product_id'] ) || $values['product_id'] == 636 ) { $disable_flat_rate = true; break; } } if ( $disable_flat_rate ) { // Loop through the shipping rates and remove flat rate foreach ( $rates as $rate_id => $rate ) { if ( $rate->method_id === 'flat_rate' ) { unset( $rates[$rate_id] ); } } } return $rates; }
The code removes all shipping methods and applies free shipping only.
You can use multiple free shipping methods and target the one which doesn’t require any conditions.
Remove Local Pickup
The code will also include local pickup. To remove the local_pickup
method as well, change the conditional to this :
if ( $rate->method_id === 'flat_rate' || $rate->method_id === 'local_pickup' ) {
Note : If testing, you may need to clear customer sessions and the template cache.
Usage
Make sure you swap out the shipping class slug sample and product id 636 to match your own.
Result
Shows only the free shipping method for products assigned the sample shipping class.
Leave a Reply
You must be logged in to post a comment.