We ran into a problem recently with a new product that could only be sold in boxes of 8 units, but were tracked in the supplier’s inventory as single units.

We couldn’t create a new SKU, because our stock levels would quickly go out of sync. The best solution was to set a minimum order quantity of 8, which can be done in WooCommerce by adding the following code to your theme’s Functions.php file

// Set minimum order on single product pages
add_filter( 'woocommerce_quantity_input_args', 'lw_min_max_order_quantity', 20, 2 );
function lw_min_max_order_quantity( $args, $product ) {

   //The ID or IDs of products to which this rule should be applied.
    $product_ids = array('42058', '42065');

    $quantity = 8;

    if( in_array( $product->get_id(), $product_ids ) || ( $product->is_type('variation') && in_array( $product->get_parent_id(), $product_ids ) ) ){
        $args['min_value'] = $quantity;

        //Because the product must be sold in a multiple of eight, we also need to set a maximum order quantity of 8.
	$args['max_value'] = $quantity;
    }

    return $args;
}

// On product archive pages
add_filter( 'woocommerce_loop_add_to_cart_link', 'lw_min_max_order_quantity_archive', 50, 2 );
function lw_min_max_order_quantity_archive( $button, $product  ) {
    // Only for non variable products
    if( $product->is_type( 'variable' ) ) return $button; // Exit

   //The ID or IDs of products to which this rule should be applied.
    $product_ids = array('42058', '42065');

    $quantity = 8;

    if( in_array( $product->get_id(), $product_ids ) ){
        $class = implode( ' ', array_filter( array(
            'button',
            'product_type_' . $product->get_type(),
            $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
            $product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : '',
        ) ) );

        $button = sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',
            esc_url( $product->add_to_cart_url() ),
            esc_attr( isset( $quantity ) ? $quantity : 1 ),
            esc_attr( $product->get_id() ),
            esc_attr( $product->get_sku() ),
            esc_attr( isset( $class ) ? $class : 'button' ),
            esc_html( $product->add_to_cart_text() )
        );
    }
    return $button;
}

There’s two functions here. The first one applies the rule to single product pages, while the second one applies the rule to the “Add To Cart” buttons on product archive pages.

The product IDs can be found by hovering over the product in the WooCommerce Products list.

Leave a Reply