Search code examples
phpwordpresswoocommercecartcheckout

Disable WooCommerce Checkout if cart count is not divisible by a certain number


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 ) );
}

Solution

  • 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.