Say you operate a
WooCommerce store where you sell
products that are shipped in boxes but want customers to make up their
own boxes with different products, by default WooCommerce will only
allow you to sell products in the the quantities you set the product up
with and the customer will be able to check out with any amount of items
in the cart.
For instance if you operate a
online wine store with WooCommerce and would like to
sell your wine by the bottle but only want customers to
checkout if they have quantities selected that would make up a whole box, the following tutorial is for you.
With the code below you can setup your products that each product is a
single bottle of wine and then force the customer to add multiples of
any 6 products to the cart before they would be able to checkout. If the
customer for example adds only 5 bottles to the cart and then tries to
checkout they will be presented with a message to order in multiples of
6.
You can even take it a step further and only allow the rule to apply
to products with a certain shipping class, this will allow you to sell
single bottles as well as cases without having the multiples rule apply
to the case products.
To
force the customer to add multiples of a certain quantity to the cart before being able to checkout add the following code to your theme’s functions.php file.
<?php
// 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() {
$multiples = 6;
$total_products = 0;
foreach ( WC()->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 ), 'error' );
}
// Limit cart items with a certain shipping class to be purchased in multiple only
add_action( 'woocommerce_check_cart_items', 'woocommerce_check_cart_quantities_for_class' );
function woocommerce_check_cart_quantities_for_class() {
$multiples = 6;
$class = 'bottle';
$total_products = 0;
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$product = get_product( $values['product_id'] );
if ( $product->get_shipping_class() == $class ) {
$total_products += $values['quantity'];
}
}
if ( ( $total_products % $multiples ) > 0 )
wc_add_notice( sprintf( __('You need to purchase bottles in quantities of %s', 'woocommerce'), $multiples ), 'error' );
}
?>