如何从订单对象中获取WooCommerce精选变体

时间:2019-06-30 作者:wpdev

我正在尝试从订单中获取选定的变体。

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\' );
    }
}
但这会得到所有的变化值。我只想被选中。

3 个回复
最合适的回答,由SO网友:HK89 整理而成

根据您的需要遵循以下代码

使用get\\u variation\\u 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
            }
        }
    }
   }

SO网友:Maciej Rogosz

为什么?get_attribute()? 也许你在找get_title()? 这将检索变体的名称。

SO网友:Ale

我认为您需要的是以下代码:

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

    foreach ( $items as $item ) {
        $product      = $item->get_product();
        //check if this is a variation using 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 ) {
                    // whatever you want to do next
                }
            }
        }
    }
它所做的是查看订单中的每个项目,并检查它是否实际上是一个可变项目。如果是,那么它将获得其变体ID,并从中获得变体属性,您可以循环遍历其中的每个属性,以找到您需要的一个。

这里还有另一种检查a项是否可变的方法。这样,您就可以获得变体ID(如果有)。

$variation_id = $item->get_variation_id();
if(! empty($variation_id) {
// item is variable and we can check its variation
}
我知道这是一个老生常谈的问题,但希望这对任何来这里的人都有用。

相关推荐

使用POSTS_ORDERBY过滤器和POST元值对搜索结果进行重新排序

我想根据帖子元和日期重新排序搜索结果。post元键是_prioritize_s 价值并不重要。因此,在“普通”元查询中,我只需编写compare 要检查的参数是否存在。虽然我有元查询的经验,但直到现在我还从未对搜索结果进行过重新排序,所以我非常感谢您的帮助。This is how I\'d like to re-order the search results:<检查帖子是否带有post meta_prioritize_s 存在于搜索结果中,如果存在,请按日期顺序(从最近到最旧)将其放在结果的顶部。