In Woocommerce, I want to offer free shipping based on the number of cart items. First, I began looking at the available plugins and I can't find any simple solution based on quantity.
All I want to do is: buy 2 of anything and get free shipping.
Messing around, I tried the following code:
function free_ship( $is_available ) {
$count = 0;
global $woocommerce;
$items = $woocommerce->cart->get_cart();
foreach($items as $item) {
$count++;
}
echo $count;
if ( $count == 1 ) {
echo 'add one more for free shipping';
return $is_available;
} elseif ($count > 1) {
echo 'you get free shipping';
return false;
} else {
echo 'nothing in your cart';
return $is_available;
}
}
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_ship' );
But it hangs when adding items to the cart. It also is buggy when removing things from the cart. I'd like to figure this out in PHP, so that I can further add more unique conditions in they happen to pop up in the future.
Have any suggestions?
There are some mistakes in your code, like missing arguments, complications and outdated things… Try the following instead:
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_shipping_for_x_cart_items', 10, 3 );
function free_shipping_for_x_cart_items( $is_available, $package, $shipping_method ) {
$item_count = WC()->cart->get_cart_contents_count();
if ( $item_count == 1 ) {
$notice = __("Add one more for free shipping");
$is_available = false;
} elseif ($item_count > 1) {
$notice = __("You get free shipping");
$is_available = true;
}
if ( isset($notice) ) {
wc_add_notice( $notice, 'notice' );
}
return $is_available;
}
This code goes in function.php file of your active child theme (or active theme). Tested and works.
The WC_Cart
method get_cart_contents_count()
get the count of all items (including quantities).
To get the count of different cart items (without including quantities), replace the line:
$item_count = WC()->cart->get_cart_contents_count();
with this one:
$item_count = sizeof($package['contents']);