Try this one (replace $special_products = array( <id1>, <id2>, ... );
with your list of product IDs):
// Set a minimum number of products requirement before checking out
add_action( 'woocommerce_check_cart_items', 'spyr_set_min_num_products' );
function spyr_set_min_num_products() {
// Only run in the Cart or Checkout pages
if( is_cart() || is_checkout() ) {
// List of "special" products IDs
$special_products = array( <id1>, <id2>, ... );
// Get an array of product IDs
$products = array_column( WC()->cart->get_cart(), 'product_id' );
if ( $products ) {
foreach ( $products as $product ) {
// Return immediately if a "special" product ID found
// (therefore skipping product count check)
if ( in_array( $product, $special_products ) ) return;
}
}
// Set the minimum number of products before checking out
$minimum_num_products = 12;
// Get the Cart's total number of products
$cart_num_products = WC()->cart->get_cart_contents_count();
// Compare values and add an error is Cart's total number of products
// happens to be less than the minimum required before checking out.
// Will display a message along the lines of
// A Minimum of 20 products is required before checking out. (Cont. below)
// Current number of items in the cart: 6
if( $cart_num_products < $minimum_num_products ) {
// Display our error message
wc_add_notice( sprintf( '<strong>A Minimum of %s products is required before checking out.</strong>'
. '<br />Current number of items in the cart: %s.',
$minimum_num_products,
$cart_num_products ),
'error' );
}
}
}
I replace $cart_num_products = WC()->cart->cart_contents_count;
with $cart_num_products = WC()->cart->get_cart_contents_count();
because the first form is deprecated since WooCommerce 3.0. global $woocommerce;
is also not needed anymore, nowadays any access to global $woocommerce
object should be done via WC()
function.