How to view stock status in WooCommerce product list

It is great for users if they can see the stock status already in the product list, i.e. in the product category or in the “Shop” subpage. They can save themselves the disappointment of choosing a product when they can see directly whether or not it is in stock.

There is one very simple snippet that solves this. Its problem is that it only works for simple products and it only works with the “in stock/out of stock” system. This is, of course, an insufficient solution for most e-shops.

For my client’s needs, I have therefore modified this snippet to work for variable products and to work for products that are in the “on order” state.

  1. function envy_stock_catalog() {
  2.     global $product;
  3.     //check the variable products
  4.     if ( $product->get_type() == 'variable' ) { 
  5.     	foreach ( $product->get_available_variations() as $key ) {
  6.             $attr_string = array();
  7.             foreach ( $key['attributes'] as $attr_name => $attr_value ) {
  8.                 $attr_string[] = $attr_value;
  9.             }
  10.             if ( $key['max_qty'] > 0 ) { 
  11.               $var_result[] = true;
  12.             } else { 
  13.               $var_result[] = false;
  14.             }
  15.         }
  16.     }
  17. if ( ($product->is_in_stock() && $product->get_stock_quantity() > 0) || (is_array($var_result) && in_array(true, $var_result)) ) {
  18.         echo '<div class="stock">' . __( ' Skladom', 'envy' ) . '</div>';
  19.     } elseif($product-&gt;is_in_stock() &amp;&amp; $product-&gt;get_stock_quantity() <1) { echo '{{{wpml_tag_6}}}' . __( ' Na objednávku', 'envy' ) . '{{{wpml_tag_7}}}';
  20. 	} else {
  21.         echo '{{{wpml_tag_8}}}' . __( 'Nie je na sklade', 'envy' ) . '{{{wpml_tag_9}}}';
  22.     }
  23. }
  24. add_action( 'woocommerce_after_shop_loop_item_title', 'envy_stock_catalog' );
  25. {{{wpml_tag_10}}}
  26.  
  27. &nbsp;
  28. {{{wpml_tag_11}}}Popis funkcionality{{{wpml_tag_12}}}
  29. Ide o klasický Woocommerce filter. Oznámenie o stave skladu budeme vkladať medzi cenu a tlačidlo košíka. Preto použijeme hook {{{wpml_tag_13}}}woocommerce_after_shop_loop_item_title{{{wpml_tag_14}}}. Názov funkcie som nechal pôvodný, podľa pôvodného snippetu, teda {{{wpml_tag_15}}}envy_stock_catalog{{{wpml_tag_16}}}, ktorý je ale upravený tak, aby fungoval aj pre ostatné produkty a stavy skladu. 
  30.  
  31. Najprv si zistíme, či produkt je variabilný, alebo jednoduchý. Ak je variabilný, pomocou foreach cyklu prebehneme jeho varianty. Ďalej každú variantu si v druhom foreachi prebehneme a zistíme hodnotu premennej {{{wpml_tag_17}}}max_qty{{{wpml_tag_18}}}, to je vlastne počet produktov na sklade. Toto číslo sa používa aj pri zadávaní počtu kusov, ktoré chceme kúpiť pri pridávaní do košíka (ak máme skladom 10 ks, nedovolí nám to do košíka vložiť 11 ks). Ak je {{{wpml_tag_19}}}max_qty{{{wpml_tag_20}}} väčšie ako 0, znamená to, že daná varianta produktu je skladom. Výsledky si ukladáme do poľa {{{wpml_tag_21}}}$var_result{{{wpml_tag_22}}} a to tak, že hodnota bude true/false, podľa toho, či daná varianta je, alebo nie je skladom.
  32.  
  33. Naša filozofia teda funguje tak, že ak je aspoň jedna varianta produktu skladom, tak pri produkte napíšeme, že je celý produkt skladom. Teda ak máme tričko Metallica, ktoré predávame vo variantoch S, M, L, XL a máme skladom aspoň jeden kus vo variante (napr. L), budeme pri takomto produkte písať, že je skladom. Neriešime, že varianty S, M a XL skladom nie sú.
  34.  
  35. V druhej časti kódu prichádzame k takej trošku "harakiri" podmienke, ktorá je ale nevyhnutná. V prvej časti podmienky kontrolujeme, či je produkt skladom a či množstvo na sklade je väčšie ako 0. To sa týka jednoduchých produktov, ktoré sú na sklade. Ak sú na sklade, to znamená, že ich musí byť viac ako 0. 
  36. ALEBO
  37. Či premenná {{{wpml_tag_23}}}$var_result{{{wpml_tag_24}}} je pole a či sa v tomto polí nachádza aspoň jedna hodnota TRUE. Toto sa zase týka variabilných produktov. Ak je aspoň jedna hodnota v poli TRUE, znamená to, že produkt je skladom. Ak je podmienka splnená, jednoducho vypíšeme do CSSkovej triedy "stock", že produkt je skladom. 
  38.  
  39. Ak product síce je skladom, ale množstvo produktov na sklade je 0 a menej, automaticky vieme, že ide o produkty na objednávku. Woocommerce má totiž takú funkcionalitu, že produkty, ktoré sú dostupné len na objednávku, idú skladovo do záporných čísel. Teda produkt už nie je skladom, ale dá sa objednať (čiže stále má $product->is_in_stock() hodnotu TRUE). Ak si takýto produkt, ktorého máme na sklade 0, niekto objedná, množstvo na sklade klesne na -1. Ak si takýto produkt objedná 10 ľudí, množstvo na sklade klesne na -10 atď. Každopádne ide o čísla záporné a o nulu, čiže preto tá podmienka "je menší ako jeden". Ak sa dostaneme do tejto podmienky, pridáme CSSkovú triedu "stock-order-only" a napíšeme, že produkt je na objednávku. 
  40.  
  41. No a ak nenastane ani jedna z týchto situácií, tak ideme v podmienke do "else" a o takomto produkte vieme, že proste nie je skladom. Vypíšeme to s CSSkovou triedou "out-of-stock".

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top