WooCommerce получает имя и значение атрибута вариации продукта из элементов заказа

Я создаю специальную страницу с благодарностью для своего магазина WooCommerce, где я могу правильно отобразить атрибут и значение элемента корзины, но на странице благодарности я не смог показать это. Не могли бы вы мне это помочь?

Рабочий код для товара в мини-тележке:

$items = WC()->cart->get_cart();
foreach($items as $item => $values) {
    
    $cart_item = WC()->cart->cart_contents[ $item ];
    $variations   = wc_get_formatted_cart_item_data( $cart_item );
    if( $cart_item['data']->is_type( 'variation' ) ){
        $attributes = $cart_item['data']->get_attributes();
        $variation_names = array();
        if( $attributes ){
            foreach ( $attributes as $key => $value) {
                $variation_key =  end(explode('-', $key));
                $variation_names[] = ucfirst($variation_key) .' : '. $value;
            }
        }
        echo implode( '<br>', $variation_names );
        
    }
    
}

И вывод вроде

Color : Red
Size  : 4mm

То же самое, что я люблю показывать на странице благодарности, поэтому я перекодировал его, как формат заказа, и прокрутил его, что не работает

$items = $order->get_items();
foreach ($items as $item_key => $item) {
    $product = $item->get_product(); 
    if( $product->is_type( 'variation' )){
        $attributes = $product->get_variation_attributes();
        $variation_names = array();
        if( $attributes ){
            foreach ( $attributes as $key => $value) {
                $variation_key =  end(explode('_', $key));
                $variation_names[] = ucfirst($variation_key) .' : '. $value;
            }
        }
        echo implode( '<br>', $variation_names );
    }
}

person Firefog    schedule 02.11.2020    source источник


Ответы (1)


Используйте $item->get_product(), чтобы получить текущий WC_Product Объект из позиций заказа, используя метод get_attributes() для вариантов продукта, вместо get_variation_attributes(), который должен использоваться только для продуктов с родительскими переменными.

$order_items = $order->get_items();

foreach ($order_items as $item_key => $item) {
    $product = $item->get_product(); // Get the WC_Product Object

    if( $product->is_type( 'variation' ) ){
        $attributes = $product->get_attributes();
        $variation_names = array();

        if( $attributes ){
            foreach ( $attributes as $key => $value) {
                $variation_key =  end(explode('-', $key));
                $variation_names[] = ucfirst($variation_key) .' : '. $value;
            }
        }
        echo implode( '<br>', $variation_names );
    }
}

Теперь он должен работать.

person LoicTheAztec    schedule 02.11.2020
comment
да, спасибо, работает $attributes = $product->get_attributes(); - person Firefog; 02.11.2020