Pre užívateľov je super, ak majú zobrazený stav na sklade už na zozname produktov, teda v kategórií produktov, alebo v podstránke “Obchod”. Môžu si tak ušetriť sklamanie už pri výbere produktu, kedy priamo vidia, či je, alebo nie je na sklade.
Existuje jeden veľmi jednoduchý snippet, ktorý toto rieši. Jeho problém je ten, že funguje iba pre jednoduché produkty a funguje len systémom „je skladom / nie je na sklade“. To je, samozrejme, pre väčšišnu e-shopov nedostačujúce riešenie.
Pre potreby svojho klienta som preto tento snippet upravil tak, aby fungoval aj pre variabilné produkty, a aby fungoval aj pre produkty, ktoré sú v stave „na objednávku“.
function envy_stock_catalog() {
global $product;
//check the variable products
if ( $product->get_type() == 'variable' ) {
foreach ( $product->get_available_variations() as $key ) {
$attr_string = array();
foreach ( $key['attributes'] as $attr_name => $attr_value ) {
$attr_string[] = $attr_value;
}
if ( $key['max_qty'] > 0 ) {
$var_result[] = true;
} else {
$var_result[] = false;
}
}
}
if ( ($product->is_in_stock() && $product->get_stock_quantity() > 0) || (is_array($var_result) && in_array(true, $var_result)) ) {
echo '<div class="stock" >' . __( ' Skladom', 'envy' ) . '</div>';
} elseif($product->is_in_stock() && $product->get_stock_quantity() < 1) {
echo '<div class="stock stock-order-only" >' . __( ' Na objednávku', 'envy' ) . '</div>';
} else {
echo '<div class="out-of-stock" >' . __( 'Nie je na sklade', 'envy' ) . '</div>';
}
}
add_action( 'woocommerce_after_shop_loop_item_title', 'envy_stock_catalog' );
Popis funkcionality
Ide o klasický Woocommerce filter. Oznámenie o stave skladu budeme vkladať medzi cenu a tlačidlo košíka. Preto použijeme hook woocommerce_after_shop_loop_item_title. Názov funkcie som nechal pôvodný, podľa pôvodného snippetu, teda envy_stock_catalog, ktorý je ale upravený tak, aby fungoval aj pre ostatné produkty a stavy skladu.
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 max_qty, 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 max_qty väčšie ako 0, znamená to, že daná varianta produktu je skladom. Výsledky si ukladáme do poľa $var_result a to tak, že hodnota bude true/false, podľa toho, či daná varianta je, alebo nie je skladom.
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ú.
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.
ALEBO
Či premenná $var_result 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.
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.
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“.
Programovaniu webových stránok sa venujem od roku 2006. Pracoval som vo viacerých menších, aj väčších firmách, vždy na pozícií developera. Viem programovať v PHP a poslednú dobu sa venujem výlučne menším a stredne veľkým projektom vo WordPresse.