Показать текст «Нет в наличии» рядом с вариантом в Woocommerce

Я хочу, чтобы рядом с вариантом показывалось «Нет в наличии», когда варианта продукта нет в наличии. Ниже я использую код из этот ответ:

add_filter( 'woocommerce_variation_option_name', 
'customizing_variations_terms_name', 10, 1 );
function customizing_variations_terms_name( $term_name ){

if(is_admin())
    return $term_name;

global $product;
$second_loop_stoped = false;

// Get available product variations
$product_variations = $product->get_available_variations();

// Iterating through each available product variation
foreach($product_variations as $variation){

    $variation_id = $variation['variation_id'];
    $variation_obj = new WC_Product_Variation( $variation_id );

    ## WOOCOMMERCE RETRO COMPATIBILITY ##
    if ( version_compare( WC_VERSION, '3.0', '<' ) ) # BEFORE Version 3 (older)
    {
        $stock_status = $variation_obj->stock_status;
        $stock_qty = intval($variation_obj->stock);

        // The attributes WC slug key and slug value for this variation
        $attributes_arr = $variation_obj->get_variation_attributes();
    }
    else # For newest verions: 3.0+ (and Up)
    {
        $stock_status = $variation_obj->get_stock_status();
        $stock_qty = $variation_obj->get_stock_quantity();

        // The attributes taxonomy key and slug value for this variation
        $attributes_arr = $variation_obj->get_attributes();
    }

    if(count($attributes_arr) != 1) // Works only for 1 attribute set in the product
        return $term_name;

    // Get the terms for this attribute
    foreach( $attributes_arr as $attr_key => $term_slug){
        // Get the attribute taxonomy
        $term_key = str_replace('attribute_', '', $attr_key );

        // get the corresponding term object
        $term_obj = get_term_by( 'slug', $term_slug, $term_key );
        if( $term_obj->name == $term_name ){ // If the term name matches we stop the loops
            $second_loop_stoped = true;
            break;
        }
    }
    if($second_loop_stoped)
        break;
}
if( $stock_qty>0 )
    return $term_name .= ' - ' . $stock_status . ' ('.$stock_qty.')';
else
    return $term_name .= ' - ' . $stock_status;

}

но при тестировании на моем сайте он показывает «Нет в наличии» для всех вариантов выбранного продукта. Например, для этого продукта отображается сообщение "Нет в наличии" для все вариации у меня есть, но на самом деле только вариация "50 ליטר" есть в реале "Нет в наличии". другие варианты в наличии! Я использую версию Woocommerce 3.3.5. Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы показать, что нет в наличии рядом с вариантами, если товара действительно нет в наличии, потому что я использую переключатели в качестве замены стандартной кнопки раскрывающегося списка из Woocommerce.


person DrMTR    schedule 16.04.2018    source источник
comment
Посмотрите, что у меня есть для варианта 10. a> Он есть в наличии, но при загрузке страницы продукта он отображается для всех товаров, которых нет в наличии. ?   -  person DrMTR    schedule 16.04.2018
comment
Я использую переключатели для вариантов, а не стандартное выпадающее меню. Ваш ответ не работает на моем сайте. Можешь взглянуть?   -  person DrMTR    schedule 16.04.2018


Ответы (1)


Кажется слишком сложным, мне удалось сделать это таким образом. Кажется, работает, отображает нет на складе для правильных вариантов, когда я тестировал его.

add_filter( 'woocommerce_variation_option_name', 'customizing_variations_terms_name', 10, 1 );

function customizing_variations_terms_name( $term_name ) {

    global $product;
    // Get available product variations
    $product_variations = $product->get_available_variations();

    // product_variation terms are normalized to lowercase with
    // spaces replaced by dashes.
    // if your term name contains capital letters or spaces i.e. 'SIZE 6'
    // the product variation will be lowercase with dashes, i.e. 'size-6'
    /*
         $term_name = str_replace(' ', '-', strtolower($term_name));
    */

    foreach ( $product_variations as $product_variation ) {
        if( isset( $product_variation['attributes'] ) ) {
            $key = array_search($term_name, $product_variation['attributes']);

            if( $key !== false && ! $product_variation['is_in_stock'] ) {
                return $term_name . ' - Out of Stock';
            }
        }
    }

    return $term_name;
}

В дополнение к этому вы можете сделать продукт серым, чтобы они не могли его выбрать, если это то, что ему нужно.

add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_when_out_of_stock', 10, 2 );

function grey_out_variations_when_out_of_stock( $grey_out, $variation ) {

    if ( ! $variation->is_in_stock() )
        return false;

    return true;
}
person Andrew Schultz    schedule 16.04.2018
comment
Посмотрите, что мне даст, когда я применю вашу первую функцию. У меня не отображается товар, которого нет в наличии. - person DrMTR; 16.04.2018
comment
Кажется, что ваш код не обновлял никаких изменений. Можете ли вы взглянуть? - person DrMTR; 16.04.2018
comment
Это работает в магазине, но вызывает сбой при редактировании продукта администратором! Любое исправление для этого - person niksos; 07.05.2020
comment
if( !is_admin() ) { } делает свое дело - person niksos; 07.05.2020