Получить значение слага атрибута по идентификатору изменения в Woocommerce


Я создаю пользовательскую страницу продукта, но у меня проблемы с вариантами

Это мой код:

global $product;
$variations = $product->get_available_variations();

foreach($variations as $variation)
{

     $variation_id = $variation['variation_id'];

     $variation_obj = new WC_Product_variation($variation_id);

     //THIS IS PROBLEM FAIL TEST (It's exemple)
     $type = $variation_obj->get_attributes()->get_name();
     //-----

     $stock = $variation_obj->get_stock_quantity();
     $COD = $variation_obj->get_sku();
     $regularprice = $variation_obj->get_regular_price();
     $saleprice = $variation_obj->get_sale_price();
     $diff = $regularprice-$saleprice;

     echo "<p>Variation: " .$type."</p>";
     echo "<p>P.Code: " .$COD."</p>";
     echo "<p>Regular price: ".$regularprice."</p>";
     echo "<p>Sale price: ".$saleprice."</p>";
     echo "<p>Difference: ". $diff."</p>";
     echo "<p>Stock: ".$stock."</p>";
}

Мне интересно, можно ли извлечь единственное имя атрибута или вариации?

Или название вариации без полного названия?

Пример: Я хочу "синий"... не "Волшебный красивый пуф Lumaland - синий"

Мы будем очень признательны за любую помощь.

Author: LoicTheAztec, 2018-06-21

2 answers

Массив значений атрибутов slug включен в массив $variation. Так что попробуйте вместо этого:

global $product;
if($product->is_type('variable')){
    $variations = $product->get_available_variations();

    foreach($variations as $variation)
    {
        $variation_obj = wc_get_product($variation['variation_id']);

        // Variation can have many poduct attributes
        $attr_slugs = implode(', ', $variation['attributes']);

        $stock = $variation_obj->get_stock_quantity();
        $COD = $variation_obj->get_sku();
        $regularprice = $variation_obj->get_regular_price();
        $saleprice = $variation_obj->get_sale_price();
        $diff = $regularprice-$saleprice;

        echo "<p>Var Name: " .$attr_slugs."</p>";
        echo "<p>Var Name: " .$COD."</p>";
        echo "<p>regular price: ".$variation['display_regular_price']."</p>";

        echo "<p>sale price: ".$saleprice."</p>";
        echo "<p>risparmi: ". $diff."</p>";
        echo "<p>in stock: ".$stock."</p>";
    }
}

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

 1
Author: LoicTheAztec, 2018-06-21 12:31:25

Код обновления:

Теперь можно циклически изменять все возможные варианты идентификатора и назначать им идентификатор для таргетинга с помощью Js:

// cicle all outputs
$allvariations = $product->get_available_variations();
foreach($allvariations as $variation)
{

    // find actual variation, ID
    $this_Variation     = wc_get_product($variation['variation_id']);

    // all sub value of the ID
    $type_selected      = implode(', ', $variation['attributes']); // this create a simple autoput name
    $type_target        = implode('_', $variation['attributes']); // this create a Id for targetting the correct outputs
    $stock_status       = $this_Variation ->get_stock_status();
    $stock              = $this_Variation ->get_stock_quantity();
    $COD                = $this_Variation ->get_sku();
    $regularprice       = $this_Variation ->get_regular_price();
    $saleprice          = $this_Variation ->get_sale_price();
    $diff               = $regularprice-$saleprice;
    $imgurl             = $variation['image']['url'];
    //... and other if you wont


    //output
    echo'<div id="'.$type_target.'">';

        // html Output:
        if( $imgurl )
        {
            echo '<img src="'.$imgurl.'"/>';
        }
        else
        {
            echo '<img src="unavailabe" />';
        }

        echo "<p>Product type: " .$type_selected."</p>";
        echo "<p>P. COD: " .$COD."</p>";

        if( $saleprice >= 1 )
        {
            echo "<p>Regular price: ".$variation['display_regular_price']."</p>";
            echo "<p>Sale price: ".$saleprice."</p>";
            echo "<p>Sale difference: ". $diff."</p>";
        }
        else
        {
            echo "<p>Price: ".$variation['display_regular_price']."</p>";
        }

        if( $stock == 0 || $stock_status == "outofstock" )
        {
            echo "<p><b>OUT OF STOCK!</b></p>";
        }
        else
        {
            echo "<p>We have: ".$stock." atricles in stock</p>";
        }

    echo "</div>";
}

Пример вывода продукта (cicle для всех продуктов и извлеченных опций):

<div id="Small_Orange">
   <img src="http://xxxx/xxx/theimage.jpg">
   <p>Product type: Small, Rose</p>
   <p>P. COD: PF_LMLND-112233</p>
   <p>Price: 22</p>
   <p>We have: 150 atricles in stock</p>
</div>

Для этого нам нужен атрибут. Мы можем получить это с помощью этого (это простая идея):

// cicle all options
foreach ( $product->get_attributes() as $attribute )
{


    // Write a option name group (ex... "color")
    echo "<p><b>".$attribute['name']."</b></p>";


    // Loop the attr by name
    $attributeValues = explode('|',$attribute['value']);
    foreach ( $attributeValues as $thisValue )
    {

        // From name to radio selector
        echo $attributes_list = '
            <span class="button-group">
                <label for="'.$thisValue.'">'.$thisValue.'</label>
                <input class="button-radio" type="radio" id="'.$thisValue.'" name="'.$attribute['name'].'" />
            </span>
            ';
    }

}

Теперь у нас есть радио или кнопка или другое для ввода идентификатора цели в список вывода. А пока, скоро увидимся с вами для окончательного кода...

Спасибо за помощь.

 0
Author: Alberto, 2018-06-22 09:53:06