Ako zobraziť stav skladu hneď vo výbere variabilných produktov?

Woocommerce a variabilné produkty. Často využívaná funkcionalita. Čo je ale dosť obmedzujúce a otravné, je to, že skladové zásoby sa nezobrazujú hneď, ale až po navolení konkrétneho variantu. Vtedy pod výberovým boxom vyskočí informácia, či produkt je, alebo nie je na sklade. V tomto článku si ukážeme krátky kód, ktorý treba vložiť do functions.php súboru aktívnej témy, aby sa táto funkcionalita aktivovala aj pre Váš e-shop. 

Tento kód som našiel v rámci googlenia a použil som ho pre e-shop www.runfun.sk

Moja úprava spočívala v preložení slov „Skladom“ a „Nie je na sklade“. Tiež som dorobil funkcionalitu, ktorá položky, ktoré nie sú skladom, zablokuje, aby sa nedali vybrať. Tento kód si môžete smelo skopírovať a použiť. 

				
					
// Utility function to get the price or the stock status of a variation from it's attribute value
function get_variation_price_stock_string( $product, $name, $term_slug ){
    foreach ( $product->get_available_variations() as $variation ){
        if($variation['attributes'][$name] == $term_slug ){
            $stock_status = $variation['is_in_stock'] == 1 ? __('Skladom') : __('Nie je na sklade');
            $result['text'] = ' - '.strip_tags( $variation['price_html'] ) . $stock_status;
            $result['stock_bool'] = $variation['is_in_stock'];
            return $result;
        }
    }
}
// Add the price and stock status to the dropdown options items.
add_filter( 'woocommerce_dropdown_variation_attribute_options_html', 'show_stock_status_in_dropdown', 10, 2);
function show_stock_status_in_dropdown( $html, $args ) {
    // Only if there is a unique variation attribute (one dropdown)
    if( sizeof($args['product']->get_variation_attributes()) == 1 ) :
    $options               = $args['options'];
    $product               = $args['product'];
    $attribute             = $args['attribute'];
    $name                  = $args['name'] ? $args['name'] : 'attribute_' . sanitize_title( $attribute );
    $id                    = $args['id'] ? $args['id'] : sanitize_title( $attribute );
    $class                 = $args['class'];
    $show_option_none      = $args['show_option_none'] ? true : false;
    $show_option_none_text = $args['show_option_none'] ? $args['show_option_none'] : __( 'Choose an option', 'woocommerce' );
    if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) {
        $attributes = $product->get_variation_attributes();
        $options    = $attributes[ $attribute ];
    }
    $html = '<select id="' . esc_attr( $id ) . '" name="' . esc_attr( $name ) . '" data-attribute_name="attribute_' . esc_attr( sanitize_title( $attribute ) ) . '" data-show_option_none="' . ( $show_option_none ? 'yes' : 'no' ) . '">';
    $html .= '<option value="">' . esc_html( $show_option_none_text ) . '</option>';
    if ( ! empty( $options ) ) {
        if ( $product && taxonomy_exists( $attribute ) ) { 
            $terms = wc_get_product_terms( $product->get_id(), $attribute, array( 'fields' => 'all' ) );
            foreach ( $terms as $term ) {
                if ( in_array( $term->slug, $options ) ) {
                    // Get the price and stock status
                    $price_stock_html = get_variation_price_stock_string( $product, $name, $term->slug )['text'];
                    $is_in_stock = get_variation_price_stock_string( $product, $name, $term->slug )['stock_bool'];
                    //var_dump($is_in_stock);
                    if($is_in_stock) 
                        $disabled_item = "";
                    else
                        $disabled_item = "disabled";
                    // Insert the price and stock status
                    $html .= '<option '.$disabled_item.' value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $args['selected'] ), $term->slug, false ) .'>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $term->name ) . $price_stock_html  ) . '</option>';
                }
            }
        } else {
            foreach ( $options as $option ) {
                $selected = sanitize_title( $args['selected'] ) === $args['selected'] ? selected( $args['selected'], sanitize_title( $option ), false ) : selected( $args['selected'], $option, false );
                // Get the price and stock status
                $price_stock_html = get_variation_price_stock_string( $product, $name, $term->slug )['text'];
                    $is_in_stock = get_variation_price_stock_string( $product, $name, $term->slug )['stock_bool'];
                    //var_dump($is_in_stock);
                    if($is_in_stock) 
                        $disabled_item = "";
                    else
                        $disabled_item = "disabled";
                // Insert the price and stock status
                $html .= '<option '.$disabled_item.' value="' . esc_attr( $option ) . '" ' . $selected . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) . $price_stock_html ) . '</option>';
            }
        }
    }
    $html .= '</select>';
    endif;
    return $html;
}
				
			

Popis kódu

V zásade je pre nás dôležité toto:

Na riadku č. 2 je definovaná funkcia. V rámci nej prechádzame všetky varianty aktuálne zobrazeného produktu a skúmame, či daný variant je, alebo nie je skladom. Ternárny if na riadku 5 priradí hodnotu „Skladom“ ak produkt je skladom, alebo „Nie je na sklade“, ak produkt nie je na sklade. Tieto reťazce sa potom budú zobrazovať v rámci výberového boxu. Môžete si ich samozrejme prepísať, je ale nutné, aby ste pri tom nezmazali apostrofy, zátvorky, či iné znaky. To by spôsobilo syntax error a nefunkčnosť stránky. 

Na riadku č. 14 definujeme nový filter, ktorým vlastne prepíšeme existujúcu základnú funkcionalitu woocommerce výberového boxu a nahradíme našou novou funkciou. Tu si vybudujeme vlastný selectbox. Budovanie začína na riadku č. 33. Následne pomocou foreachu na riadku 40 skúmame pre každú položku <option>, či daný variant je, alebo nie je skladom. Ak nie je skladom, navyše pridáme pre <option> ešte atribút disabled, ktorý spôsobí, že daná možnosť sa v selectboxe nebude dať vybrať. Samotné budovanie html kódu jednotlivých <option> máme na riadku č. 51. Ak variant nie je skladom, vpíše sa to za názov variantu a navyše sa pridá atribút disabled. V opačnom prípade sa vypíše „Skladom“ a atribút disabled sa nepridá, teda daná položka sa bude dať štandardne vybrať. 

Na riadku 74 vrátime celý vybudovaný html kód celého selectboxu. A výsledok? Ten vlastne vidíte celkom na vrchu tohto článku 🙂 

Pozrite aj

Migrácia do Host creators

Hovorím to so slzou na krajíčku… ale poslednú dobu (čiže asi pol roka) šiel Websupport totálne dole vodou. Všetko, až na jedno – ceny. Tie

Chcem webstránku. Abo čo. Abo jak.

Problémom mnohých klientov je to, že nevedia, čo chcú. Preto v tomto článku opíšem, čo všetko je potrebné riešiť ešte pred začiatkom spolupráce. Čím viac

50 odtieňov odžubu

Dobre bráško. Už ma to nebaví. Aby si vedel, ako sa vyhnúť podvodom, musíš najprv vedieť, ako sa veci majú a ako fungujú. Potom nenaletíš…