Search code examples
phpwordpresswoocommercestockproduct-variations

Show stock status next to each attribute value in WooCommerce variable products


I want to implement in my store something similar like this:

enter image description here

I have this code, but this show quantity next to each variation.

function get_stock_variations_from_product(){
global $product;
$variations = $product->get_available_variations();
foreach($variations as $variation){
     $variation_id = $variation['variation_id'];
     $variation_obj = new WC_Product_variation($variation_id);
     $stock = $variation_obj->get_stock_quantity();
}
}

And also this code:

  global $product;
$product_variations = $product->get_available_variations();

foreach ($product_variations as $variation)  {
    $var_data = $variation['attributes'];
    $var_data['in_stock'] = $variation['is_in_stock'];
}

//List all attributes with stock available or not array..
echo '<pre>';
print_r($var_data);
echo '</pre>';
die;

How can I customize the variable products to show stock Status next to each attribute values?


Solution

  • Faster and optimized code version for WooCommerce 3+ only in:
    Display variation stock status on single dropdown variable products in Wocommerce 3


    Updated WooCommerce compatibility or previous version 2.6.x

    You can do it using a custom function hooked in woocommerce_variation_option_name filter hook. This is only viable for products that have a unique attribute for their variations…

    Here is the code:

    add_filter( 'woocommerce_variation_option_name', 'customizing_variations_terms_name', 10, 1 );
    function customizing_variations_terms_name( $term_name ){
    
        if(is_admin())
            return $term_name;
    
        global $product;
        $second_loop_stoped = false;
    
        // Get available product variations
        $product_variations = $product->get_available_variations();
    
        // Iterating through each available product variation
        foreach($product_variations as $variation){
    
            $variation_id = $variation['variation_id'];
            $variation_obj = new WC_Product_Variation( $variation_id );
    
            ## WOOCOMMERCE RETRO COMPATIBILITY ##
            if ( version_compare( WC_VERSION, '3.0', '<' ) ) # BEFORE Version 3 (older)
            {
                $stock_status = $variation_obj->stock_status;
                $stock_qty = intval($variation_obj->stock);
    
                // The attributes WC slug key and slug value for this variation
                $attributes_arr = $variation_obj->get_variation_attributes();
            }
            else # For newest verions: 3.0+ (and Up)
            {
                $stock_status = $variation_obj->get_stock_status();
                $stock_qty = $variation_obj->get_stock_quantity();
    
                // The attributes taxonomy key and slug value for this variation
                $attributes_arr = $variation_obj->get_attributes();
            }
    
            if(count($attributes_arr) != 1) // Works only for 1 attribute set in the product
                return $term_name;
    
            // Get the terms for this attribute
            foreach( $attributes_arr as $attr_key => $term_slug){
                // Get the attribute taxonomy
                $term_key = str_replace('attribute_', '', $attr_key );
    
                // get the corresponding term object
                $term_obj = get_term_by( 'slug', $term_slug, $term_key );
                if( $term_obj->name == $term_name ){ // If the term name matches we stop the loops
                    $second_loop_stoped = true;
                    break;
                }
            }
            if($second_loop_stoped)
                break;
        }
        if( $stock_qty>0 )
            return $term_name .= ' - ' . $stock_status . ' ('.$stock_qty.')';
        else
            return $term_name .= ' - ' . $stock_status;
    
    }
    

    Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

    This code works and is tested in WooCommerce 2.6.x and 3+.


    You will get this (for example):

    enter image description here

    You can use other WC_Product_Variation or WC_Product methods to get and display the data you want…