neilgee
neilgee

Reputation: 538

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

Upvotes: 2

Views: 886

Answers (1)

LoicTheAztec
LoicTheAztec

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

Related Questions