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 ) . '" class="' . esc_attr( $class ) . '" 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 🙂 

Najnovšie články

Čo je hosting a čo je doména?

Máš doménu, to je super. Ale zároveň aj málo platné. Doména je ako taká poštová schránka. Môžeš si ju kúpiť a nalepiť na čelo, ale

Phishing

Keďže v minulom článku o hashovaní sme si povedali, že hash sa nedá len tak ľahko rozlúštiť, internetoví zločinci, ktorí túžia po tvojich heslách, musia

Nové projekty

Abridged

Webová prezentácia pre firmu, ktorá sa zameriava na marketing malých a stredných firiem.

Klub Slovenských turistov Dolný Kubín

Prezentačná webová stránka turistického klubu, s obsahom aktualít a udalosti. Udalosti tvorené cez CPT a ACF s custom filtrom, ktorý zobrazuje len nadchádzajúce, alebo len

No-hate

Článkový portál, tematicky zameraný na boj s extrémizmom, hejtom a ostatnými neblahými vplyvmi v našej aktuálnej spoločnosti. Projekt bol spustený pod hlavičkou Katedry politológie TNUNI.