Reputation: 538
I have some code to check amount of products in WooCommerce is divisible by 6 - however even though a notice is displayed the customer can still checkout with incorrect quantities.
How can I disable WooCommerce 'Place Order' checkout if the condition is not met?
// check that cart items quantities totals are in multiples of 6
add_action( 'woocommerce_check_cart_items', 'woocommerce_check_cart_quantities' );
function woocommerce_check_cart_quantities() {
global $woocommerce;
$multiples = 6;
$total_products = 0;
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
$total_products += $values['quantity'];
}
if ( ( $total_products % $multiples ) > 0 )
wc_add_notice( sprintf( __('You need to buy in quantities of %s products', 'woocommerce'), $multiples ) );
}
Upvotes: 2
Views: 886
Reputation: 254072
The hook woocommerce_check_cart_items
needs an "error" notice to disable checkout (which was not the case). I have also simplified the code:
// Check cart items conditionally displaying an error notice and avoiding checkout
add_action( 'woocommerce_check_cart_items', 'check_cart_items_conditionally' );
function check_cart_items_conditionally() {
$multiple_of = 6; // <= Here set the "multiple of" number
if ( ( WC()->cart->get_cart_contents_count() % $multiple_of ) != 0 ) {
wc_add_notice( sprintf( __('You need to buy in quantities of %s products', 'woocommerce'), $multiple_of ), 'error' );
}
}
Optional: To be sure that checkout is not accessible you can add the following that will redirect checkout to cart page if cart items total count is not a multiples of N:
// To be sure: redirect checkout to cart page if cart items count is not a multiples of N
add_action( 'template_redirect', 'redirect_checkout_to_cart_conditionally' );
function redirect_checkout_to_cart_conditionally() {
$multiple_of = 6; // <= Here set the "multiple of" number
if ( is_checkout() && ( WC()->cart->get_cart_contents_count() % $multiple_of ) != 0 ) {
wp_redirect( wc_get_cart_url() );
exit();
}
}
Code goes in functions.php file of the active child theme (or active theme). Tested and works.
Upvotes: 1