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.
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 = '';
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?