I have a client that sells books and all their books (except for 2 products, the show special) can be purchased in assorted lots of 12 only. I have gotten a script that allows me state that 12 lots is required but I need to exclude the 2 specials products from the rule.
Here is the script
// 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() ) {
global $woocommerce;
// 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->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 will be most grateful to have this sorted by able developers here.
Thank you in advance.
I have a client that sells books and all their books (except for 2 products, the show special) can be purchased in assorted lots of 12 only. I have gotten a script that allows me state that 12 lots is required but I need to exclude the 2 specials products from the rule.
Here is the script
// 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() ) {
global $woocommerce;
// 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->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 will be most grateful to have this sorted by able developers here.
Thank you in advance.
Share Improve this question edited Oct 8, 2020 at 8:05 fuxia♦ 107k38 gold badges255 silver badges459 bronze badges asked Oct 8, 2020 at 3:03 Adeola AzibaAdeola Aziba 136 bronze badges 8 | Show 3 more comments1 Answer
Reset to default 1Try 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.
$special_products = array( <id1>, <id2>, ... );
within your function so product identification will occur by the hardcoded list of their IDs? – Ivan Shatsky Commented Oct 9, 2020 at 13:21