我使用此函数按菜单顺序对woomerce order管理项进行排序,但带有变量的产品显示不正确。如果顺序中有多个产品具有变量,则只显示其中一个。
编辑:一个产品的多个属性有问题:
项目1:产品A,变量A,属性:红色,数量12
项目2:产品A,变量A,属性:绿色,数量18
排序后只显示:
项目1:产品A,变量A,属性:红色,数量12
换句话说,具有相同变体ID的产品项有问题。

add_filter('woocommerce_order_get_items', 'custom_woocommerce_order_get_items', 10, 2);


function custom_woocommerce_order_get_items($items, $object)
       {
           //no need to reorder if less than 2 products
           if(count($items)   <    2)
               return $items;

       //create a list of products within the order
       $products   =   array();
       foreach($items  as  $key    =>  $item)
           {
               $products[  $item['product_id']   ] =   $key;
           }

       $sorted_items  =   array();

       global $post;

       $args   =   array(
                           'posts_per_page'    =>  -1,
                           'post_type'         =>  'product',
                           'orderby'           =>  'menu_order',
                           'order'             =>  'ASC',
                           'post__in'          =>  array_keys($products)
                           );
       $custom_query   =   new WP_Query($args);
       while($custom_query->have_posts())
           {
               $custom_query->the_post();
               $sorted_items[  $products[$post->ID]    ]   =   $items[ $products[$post->ID]    ];
           }

       //check for any left outside items
       foreach($items  as  $key    =>  $item)
           {
               if(isset($sorted_items[$key]))
                   $sorted_items[  $key   ]    =   $item;
           }

       return $sorted_items;

   }

最佳答案

更新:(当产品是可变产品时包括变体ID)
代码中的主要问题是在查询中需要获取alsoproduct_variationpost类型,在第一个循环中需要获取变量产品的变体id。
此外,这段代码对于woomerce3+来说已经过时,因为order items现在是一个WC_Order_Item_Product对象,您需要使用这个类的可用方法。
您不需要global $post;对象,因为它已经作为函数中的参数。
我重新检查了你所有的代码:

add_filter( 'woocommerce_order_get_items', 'filter_order_get_items', 10, 2 );
function filter_order_get_items( $items, $order ){

    // no need to reorder if less than 2 items
    if(count($items) < 2) return $items;

    $sorted_items = $products_items_ids = array();

    // Get the array of product/variation IDs with Item IDs within the order
    foreach( $items as $item_id => $item ){
        // Get the product ID (Added WC 3+ compatibility)
        $product_id = method_exists( $item, 'get_product_id' ) ? $item->get_product_id() : $item['product_id'];
        // Get the variation ID (Added WC 3+ compatibility)
        $variation_id = method_exists( $item, 'get_variation_id' ) ? $item->get_variation_id() : $item['variation_id'];
        if( $variation_id > 0 )
            $product_id = $variation_id;
        $products_items_ids[ $product_id ] = $item_id;
    }

    // The WP Query based on the product Ids from this order
    $query = new WP_Query( array(
       'posts_per_page'  =>  -1,
       'post_type'       =>  array( 'product', 'product_variation' ), // <== HERE MISSING
       'orderby'         =>  'menu_order',
       'order'           =>  'ASC',
       'post__in'        =>  array_keys( $products_items_ids ),
    ) );

    // Loop in the Query
    if( $query->have_posts() ){
        while( $query->have_posts() ): $query->the_post();
            // Get the post ID
            $post_id = $query->post->ID;

            // Get the corresponding item ID for the current product ID
            $item_id = $products_items_ids[ $post_id ];

            // Get the new sorted array of items
            $sorted_items[$item_id] = $items[$item_id];
        endwhile;
    }
    wp_reset_query();

    return $sorted_items;
}

代码放在活动子主题(或活动主题)的function.php文件或任何插件文件中。
测试并适用于所有产品,包括Woomerce 2.5.x到3.2版本的产品变体+

07-24 09:31