Количество вариаций продукта на складе не отображается в WooCommerce

в woocommerce я изменил текст «В наличии», чтобы отображать другой текст для разных номеров запасов. Таким образом, для номеров акций больше 3 он говорит: «5 в наличии» (окрашен в зеленый цвет с помощью CSS), а для номеров акций 3 или ниже он говорит «осталось только 2» (окрашен в красный цвет с помощью CSS). Так же, как это делает Amazon.

Это прекрасно работает с простыми продуктами, как вы можете видеть здесь: https://edelmix.de/superdry-urban-blau-limette-quarzuhr-syg164un/

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

Я получаю текст с общим количеством всех вариаций. Я включил управление количеством продукта на уровне продукта в бэкэнде для всех вариантов, и у меня разные запасы на складе.

Результат для переменного продукта на данный момент можно увидеть здесь: https://stage.edelmix.de/buddha-to-buddha-blue-lace-agate-ring-603ba/

Отображаемое количество равно 5 (после выбора варианта из раскрывающегося списка). Это общее количество для всех вариаций вместе. Разные размеры колец имеют запасы 1/3/1 (как вы можете видеть из моего теста, отражающего переменную запаса рядом с ценой), и это то, что я хочу показать при выборе каждого варианта (с пользовательский текст, как и в случае с простыми товарами).

Мой код на данный момент:

add_filter( 'woocommerce_get_availability', 'custom_get_availability', 1, 2);

function custom_get_availability( $availability, $_product ) {
    global $woocommerce, $product;
    if ($_product->is_type( 'variable' ))  {
        $available_variations = $product->get_available_variations();
        foreach ($available_variations as $variation) 
            {
                $variation_id = $variation['variation_id'];
                $variation_obj = new WC_Product_Variation($variation_id);
                $stock = $variation_obj->get_stock_quantity();
                echo $stock;  // <-- for testing purpose to see if I do get the individual variation-quantities = works!!
            }
        } else {
            $stock = $product->get_stock_quantity();
        }

    // change text "In Stock' to 'Auf Lager' when quantity more than 3
    if ($_product->is_in_stock() && $stock > 3 ) $availability['availability'] = $stock . ' ' .__('auf Lager', 'woocommerce');

    // change text to n Left, where n is the quantity
    if ($_product->is_in_stock() && ($stock <= 3 )) $availability['availability'] = '<p class="stock ed_low_stock ' . esc_attr( $availability['class'] ) . '">' .  __('Nur noch ' . $stock . ' auf Lager!', 'woocommerce') . '</p>';  

    // change text "Out of Stock' to 'SOLD OUT'
    if (!$_product->is_in_stock()) $availability['availability'] = __('zzt. nicht verfügbar!', 'woocommerce');

    // change text "In Stock' to 'Special Order' for products with unmanaged stock
    if ( !$_product->managing_stock() && $_product->is_in_stock() ) $availability['availability'] = __('Auf Lager', 'woocommerce');

  return $availability;
}

Почему это не работает?

Я все перепробовал за последние часы и не знаю, почему это не работает как надо.

Любая помощь горячо приветствуется.


person Visualpro    schedule 11.12.2017    source источник
comment
Отчасти это правильно, но не отвечает на мой вопрос.   -  person Visualpro    schedule 12.12.2017
comment
Извините ... Я проверил и протестировал ваш код. Я обнаружил, что не так… См. Ответ ниже.   -  person LoicTheAztec    schedule 12.12.2017


Ответы (1)


Это не сработало, потому что вы зря создавали осложнения. В подключенной функции аргумент $product - это текущий выбранный вариант продукта (в переменном продукте), поэтому вам не нужен цикл foreach для получения вариантов из переменного продукта.

Так что теперь ваш код будет более компактным. Попробуйте вместо этого:

add_filter( 'woocommerce_get_availability', 'custom_get_availability', 1, 2);
function custom_get_availability( $availability, $_product ) {
    $stock = $_product->get_stock_quantity();

    // change text "In Stock' to 'Auf Lager' when quantity more than 3
    if ( $_product->is_in_stock() && $stock > 3 ) $availability['availability'] = $stock . ' ' .__('auf Lager', 'woocommerce');

    // change text to n Left, where n is the quantity
    if ( $_product->is_in_stock() && $stock <= 3 ) $availability['availability'] = '<p class="stock ed_low_stock ' . esc_attr( $availability['class'] ) . '">' .  __('Nur noch ' . $stock . ' auf Lager!', 'woocommerce') . '</p>';

    // change text "Out of Stock' to 'SOLD OUT'
    if (! $_product->is_in_stock() ) $availability['availability'] = __('zzt. nicht verfügbar!', 'woocommerce');

    // change text "In Stock' to 'Special Order' for products with unmanaged stock
    if ( ! $_product->managing_stock() && $_product->is_in_stock() ) $availability['availability'] = __('Auf Lager', 'woocommerce');

    return $availability;
}

Код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.

Проверено и работает

person LoicTheAztec    schedule 12.12.2017
comment
Спасибо, Лоик. Это частично решило проблему. У меня был тот же код, что и вы в начале. Но это не сработало. Поэтому я попытался решить эту проблему, изменив ее и усложнив. Мне пришлось изменить ваш код. Вместо $ product мне пришлось использовать $ _product. Это дало мне желаемый результат. Я точно не знаю, в чем разница между $ product и $ _product. Может быть, вы сможете пролить свет на разницу? - person Visualpro; 13.12.2017
comment
Я уже проголосовал за (но мой голос не отображается, потому что я здесь новичок). А теперь и отметила это. Еще раз спасибо - person Visualpro; 14.12.2017
comment
Лучший пример, который я когда-либо находил. Спасибо, @Loic проголосовали за - person Firefog; 16.04.2019