programing

Woocommerce 3에서 주문에서 선택한 변경 속성 가져오기

stoneblock 2023. 10. 11. 20:27

Woocommerce 3에서 주문에서 선택한 변경 속성 가져오기

우커머스에서는 판매 제품을 집계하는 보고서를 관리 영역에 두고 있습니다.사이트에서 판매하는 제품은 5개뿐인데 일부 제품에는 1개 또는 2개의 변형이 있습니다.이 보고서는 잘 작동하지만 변형은 무시합니다.

나는 정확하게 데이터를 표시하기 위해 주문한 항목에서 속성 값을 검색해야 합니다.이거 어떻게 해요?

get_variation_description()제가 적용하는 방식으로는 작동하지 않습니다.

내 코드:

$order = wc_get_order( $vs); 
                
//BEGIN NEW RETRIEVE ORDER ITEMS FROM ORDER 
foreach( $order->get_items() as $item_id => $item_product ){
    $ods = $item_product->get_product_id(); //Get the product ID
    $odqty= $item_product->get_quantity(); //Get the product QTY
    $item_name = $item_product->get_name(); //Get the product NAME
    $item_variation = $item_product->get_variation_description(); //NOT WORKING
}

2020년 업데이트 - "Custom Product Attribute" 취급 (변경 코드)

WC_Product 방법get_variation_description()시대에 뒤떨어졌고 더 이상 사용되지 않습니다.로 대체되었습니다.get_description()방법.그래서 당신은 그들을 위해WC_Product먼저 목적을 정합니다.

선택한 변동 속성을 얻으려면 다음을 사용합니다.get_variation_attributes( )방법.

// Get an instance of the WC_Order object from an Order ID
 $order = wc_get_order( $order_id ); 

// Loop though order "line items"
foreach( $order->get_items() as $item_id => $item ){
    $product_id   = $item->get_product_id(); //Get the product ID
    $quantity     = $item->get_quantity(); //Get the product QTY
    $product_name = $item->get_name(); //Get the product NAME

     // Get an instance of the WC_Product object (can be a product variation  too)
    $product      = $item->get_product();

     // Get the product description (works for product variation too)
    $description  = $product->get_description();

    // Only for product variation
    if( $product->is_type('variation') ){
         // Get the variation attributes
        $variation_attributes = $product->get_variation_attributes();
        // Loop through each selected attributes
        foreach($variation_attributes as $attribute_taxonomy => $term_slug ){
            // Get product attribute name or taxonomy
            $taxonomy = str_replace('attribute_', '', $attribute_taxonomy );
            // The label name from the product attribute
            $attribute_name = wc_attribute_label( $taxonomy, $product );
            // The term name (or value) from this attribute
            if( taxonomy_exists($taxonomy) ) {
                $attribute_value = get_term_by( 'slug', $term_slug, $taxonomy )->name;
            } else {
                $attribute_value = $term_slug; // For custom product attributes
            }
        }
    }
}

다른 모든 제품 유형과 마찬가지로 제품의 다양성을 테스트하고 작동합니다.

주문품명과속성키를표시하는데완벽하게작동합니다.

foreach( $order->get_items() as $order_item_product ) {
    $item_meta_data = $order_item_product->get_meta_data();
    echo $product_name = $order_item_product->get_name();
    echo '<br>';
    foreach( $item_meta_data as $meta_data ) {
        $meta_data_as_array = $meta_data->get_data();
        echo $meta_data_as_array['key'].': '.$meta_data_as_array['value'].'<br>';
    }
}

승낙된 답변을 바탕으로 오타를 수정할 수 있도록 하기 위해서입니다(다른 일을 할 평판이 없습니다).$attribute_value 속성 정의에 $term_slug이 표시됩니다.그것이 바로 달러가 빠진 것입니다.

// Get an instance of the WC_Order object from an Order ID
    $order = wc_get_order( $order_id ); 

   // Loop though order "line items"
   foreach( $order->get_items() as $item_id => $item_product ){
      $product_id = $item_product->get_product_id(); //Get the product ID
      $quantity = $item_product->get_quantity(); //Get the product QTY
      $product_name = $item_product->get_name(); //Get the product NAME

      // Get an instance of the WC_Product object (can be a product variation  too)
      $product = $item_product->get_product();

      // Get the product description (works for product variation)
      $description = $product->get_description();

      // Only for product variation
      if($product->is_type('variation')){
         // Get the variation attributes
        $variation_attributes = $product->get_variation_attributes();
        // Loop through each selected attributes
        foreach($variation_attributes as $attribute_taxonomy => $term_slug){
            $taxonomy = str_replace('attribute_', '', $attribute_taxonomy );
            // The name of the attribute
            $attribute_name = get_taxonomy( $taxonomy )->labels->singular_name;
            // The term name (or value) for this attribute
            $attribute_value = get_term_by( 'slug', $term_slug, $taxonomy )->name;
        }
      }
   }

앞으로 이 문제를 알게 된 분들을 위해 마지막 속성 값이 표시되지 않는 문제가 발생했는데 관리자에서 주문을 보고 있으면 제대로 표시가 되고 있어서 WooCommerce 소스 코드로 뛰어들어 필요에 맞게 수정했습니다.직접 수정하려면 여기에서 코드를 확인할 수 있습니다.

\woocommerce\includes\admin\meta-boxes\views\html-order-item-meta.php

모든 키와 값을 표시하기 위해 수행한 작업은 다음과 같습니다.

$attribute_list = array();

// Start modified code from html-order-item-meta.php
$hidden_order_itemmeta = apply_filters(
    'woocommerce_hidden_order_itemmeta',
    array(
        '_qty',
        '_tax_class',
        '_product_id',
        '_variation_id',
        '_line_subtotal',
        '_line_subtotal_tax',
        '_line_total',
        '_line_tax',
        'method_id',
        'cost',
        '_reduced_stock',
        '_restock_refunded_items',
    )
);

if ($meta_data = $item->get_formatted_meta_data('')) {
    foreach ($meta_data as $meta_id => $meta) {
        if (in_array($meta->key, $hidden_order_itemmeta, true)) {
            continue;
        }
        $display_key = sanitize_text_field($meta->display_key);
        $display_value = sanitize_text_field(force_balance_tags($meta->display_value));

        $attribute_list[] = array($display_key => $display_value);
    }
}
// End modified code from html-order-item-meta.php

if ($attribute_list) {
    $attribute = '';

    foreach ($attribute_list as $attributes) {
        foreach ($attributes as $attr => $value) {
            $attribute .= " - " . $attr . " : " . $value;
        }
    }

    echo $attribute;
}

내 코드는 배열에 각 키와 값을 추가한 다음 루프를 통해 키와 값을 구분자가 있는 문자열 끝에 추가합니다.이것이 제가 작업하던 일에 필요했던 것이지만, 여러분의 요구에 맞게 쉽게 조정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/48390818/get-the-selected-variation-attributes-from-orders-in-woocommerce-3