Как получить выбранную вариацию WooCommerce из объекта заказа

30 июн. 2019 г., 11:00:47
Просмотры: 14.2K
Голосов: 1

Я пытаюсь получить выбранную вариацию из заказа.

global $order;
$items = $order->get_items();

foreach( $items as $item ) {
    $product_id = $item->get_product_id();
    $product = wc_get_product( $product_id );

    if( $product->is_type( 'variable' ) ) {
        $variationName = $product->get_attribute( 'pa_my-custom-variation' );
    }
}

Но этот код получает все возможные значения вариаций. Мне нужно получить только выбранную.

0
Все ответы на вопрос 3
0

Ниже приведен код, соответствующий вашим требованиям

Для получения выбранных атрибутов вариации с использованием метода get_variation_attributes( ).

// Получаем экземпляр объекта WC_Order по ID заказа
 $order = wc_get_order( $order_id ); 

// Перебираем "позиции" заказа
foreach( $order->get_items() as $item_id => $item ){
    $product_id   = $item->get_product_id(); // Получаем ID товара
    $quantity     = $item->get_quantity(); // Получаем количество товара
    $product_name = $item->get_name(); // Получаем название товара

     // Получаем экземпляр объекта WC_Product (может быть вариацией товара)
    $product      = $item->get_product();

     // Получаем описание товара (работает и для вариаций)
    $description  = $product->get_description();

    // Только для вариаций товара
    if( $product->is_type('variation') ){
         // Получаем атрибуты вариации
        $variation_attributes = $product->get_variation_attributes();
        // Перебираем каждый выбранный атрибут
        foreach($variation_attributes as $attribute_taxonomy => $term_slug ){
            // Получаем название атрибута товара или таксономии
            $taxonomy = str_replace('attribute_', '', $attribute_taxonomy );
            // Название атрибута из метки товара
            $attribute_name = wc_attribute_label( $taxonomy, $product );
            // Название термина (или значение) этого атрибута
            if( taxonomy_exists($taxonomy) ) {
                $attribute_value = get_term_by( 'slug', $term_slug, $taxonomy )->name;
            } else {
                $attribute_value = 
   $term_slug; // Для пользовательских атрибутов товара
            }
        }
    }
   }
31 дек. 2020 г. 04:24:37
0

Думаю, вам понадобится следующий код:

    $get_order = wc_get_order( $order_id );
    $items     = $get_order->get_items();

    foreach ( $items as $item ) {
        $product      = $item->get_product();
        //проверяем, является ли это вариацией, используя is_type
        if ( 'variation' === $product->get_type() ) {
            $variation_id = $item->get_variation_id();
            $variation    = new WC_Product_Variation( $variation_id );
            $attributes   = $variation->get_attributes();
            foreach ( $attributes as $key => $value ) {
                if ( 'pa_my-custom-variation' === $key ) {
                    // здесь можно выполнить нужные действия
                }
            }
        }
    }

Этот код проверяет каждый товар в заказе, чтобы определить, является ли он вариативным. Если да, он получает ID вариации, а затем её атрибуты, после чего можно перебрать их, чтобы найти нужный.

Вот ещё один способ проверить, является ли товар вариативным. В этом случае мы получаем ID вариации, если он есть.

$variation_id = $item->get_variation_id();
if(! empty($variation_id) {
// товар является вариативным, и мы можем проверить его вариацию
}

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

24 нояб. 2020 г. 15:14:24
1

Почему get_attribute()? Возможно, вам нужно get_title()? Это позволит получить название вариации.

30 июн. 2019 г. 19:10:50
Комментарии

Я не понимаю. Как я могу использовать get_title для вариации?

wpdev wpdev
30 июн. 2019 г. 22:03:29