Menu Close

WooCommerce: Variable Product “Cumulative” Stock Quantity

default

When a variable product stock quantity is managed at variation level, the stock status is either “In stock” or “Out of stock” without any mention of the quantity.

It would be cool, however, and in certain cases only, to show the total stock quantity for all single variations. If variation Red has 3 in stock, variation Blue has 7 in stock and variation Cyan has 10 in stock, I’d like to set the “parent product” stock quantity to 3 + 7 + 10 = 20.

So, how do we do that?

This variable product has stock quantity = 13, because its two variations have stock = 3 and stock = 10 respectively!

PHP Snippet: Variable Product Stock Quantity = Sum of All Single Variations’ Stock Quantity

/**
 * @snippet       Cumulative Stock Quantity @ Variable Product
 * @how-to        Get CustomizeWoo.com FREE
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 8
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

// CALCULATE CUMULATIVE STOCK

function bbloomer_cumulative_stock_variations( $product ) {
    if ( $product->get_type() == 'variable' && ! $product->get_manage_stock() ) {
		$cumulative_stock = 0;
        foreach ( $product->get_available_variations() as $key ) {
            $variation = wc_get_product( $key['variation_id'] );
            $cumulative_stock += $variation->get_stock_quantity() ? $variation->get_stock_quantity() : 0;
        }
    }
	return $cumulative_stock;
}

// SET VARIABLE PRODUCT STOCK QUANTITY

add_filter( 'woocommerce_get_stock_html', 'bbloomer_variable_product_cumulative_stock', 9999, 2 );

function bbloomer_variable_product_cumulative_stock( $html, $product ) {
	$availability = $product->get_availability();
	if ( $product->get_type() == 'variable' && empty( $availability['availability'] ) ) {
		ob_start();
		wc_get_template(
			'single-product/stock.php',
			array(
				'product' => $product,
				'class' => bbloomer_cumulative_stock_variations( $product ) > 0 ? 'in-stock' : 'out-of-stock',
				'availability' => sprintf( __( '%s in stock', 'woocommerce' ), bbloomer_cumulative_stock_variations( $product ) ),
			)
		);
		return ob_get_clean();
	}
	return $html;
}

// SHOW STOCK @ SINGLE VARIABLE PRODUCT PAGE

add_action( 'woocommerce_before_add_to_cart_form', 'bbloomer_stock_for_variable_products' );

function bbloomer_stock_for_variable_products() {
	global $product;
	$availability = $product->get_availability();
	if ( $product->get_type() == 'variable' && empty( $availability['availability'] ) ) {
		echo wc_get_stock_html( $product );
	}
}
View Source
Posted in WooCommerce Tips