Search code examples
phpwoocommercehook-woocommerce

WooCommerce Offset Stock levels Based On Custom Field Value Threshold


I need to set a threshold on a per product basis for stock inventory.

Example : If the product has a threshold of 10 and there's 10 or less in stock, the product shows the out of stock text. If the threshold is set at 10 but there's 15 in stock, 5 is shown in stock.

So what i need to do is offset the real inventory levels on a per product basis using a value.

This is the code i'm trying to get working

add_filter( 'woocommerce_get_availability', 'override_get_availability', 10, 2);
function override_get_availability( $availability, $product ) {

$stock_threshold = get_post_meta( $product->get_id(), '_stock_threshold', true );

if ( $product->managing_stock() && ! empty( $stock_threshold ) ) {

$availability['availability'] = $product->get_stock_quantity() - $stock_threshold;

return $availability;

    }

}

This code doesn't show the Out of Stock text on the single product page if the inventory is calculated at 0 or less than zero.

Example : When the stock level is set at 2 and the offset is set at 2, it = 0 so should show Out of Stock but doesn't.


Solution

  • I think this gets you some of the way there;

    add_filter( 'woocommerce_get_availability', 'override_get_availability', 10, 2);
    function override_get_availability( $availability, $product ) {
    
    $stock_threshold =  $product->get_low_stock_amount();
    $stock_quantity = $product->get_stock_quantity();
    
    if ( $product->managing_stock() && !empty($stock_threshold) ) {
    $avail_stock = ($stock_quantity - $stock_threshold);
        if ($avail_stock <= 0){
            $availability['availability'] = __('Out of Stock', 'woocommerce');
        }
    return $availability;
        }
    }
    

    Basically, we're getting the low stock amount (threshold) and subtracting the stock quantity. If it's 0 or less, then set the availability to Out of Stock.

    This works without a problem.

    However if the product has 15 in stock and the threshold at 10, it still shows 15 as the out of stock is NOT 0.

    I think the best approach is a combination of the above, and then shortcode to display the quantity minus the threshold rather than using the code inside WooCommerce.

    Maybe someone else can build off what I have posted above as I couldn't get the quantity number to reduce on products NOT out of stock.