Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php WooCommerce按类别对订单项目进行排序_Php_Wordpress_Woocommerce_Hook Woocommerce_Orders - Fatal编程技术网

Php WooCommerce按类别对订单项目进行排序

Php WooCommerce按类别对订单项目进行排序,php,wordpress,woocommerce,hook-woocommerce,orders,Php,Wordpress,Woocommerce,Hook Woocommerce,Orders,{UPDATE} 我想按类别菜单顺序对后端订单详细信息上的产品进行排序。所以我的分类是服装、装饰、音乐,产品必须以这种方式订购 我试着用这个片段 add_filter( 'woocommerce_order_get_items', 'filter_order_get_items_by_categories12', 10, 3 ); function filter_order_get_items_by_categories12($items, $order) { global $wooco

{UPDATE}

我想按类别菜单顺序对后端订单详细信息上的产品进行排序。所以我的分类是服装、装饰、音乐,产品必须以这种方式订购

我试着用这个片段

add_filter( 'woocommerce_order_get_items', 'filter_order_get_items_by_categories12', 10, 3 );
function filter_order_get_items_by_categories12($items, $order) {
    global $woocommerce, $wpdb;

        $c1 = $wpdb->get_results( "select t1.order_item_name,t1.order_item_id,t5.name,t2.meta_value from
        wp_woocommerce_order_items as t1 LEFT JOIN wp_woocommerce_order_itemmeta as t2 ON t1.order_item_id =
        t2.order_item_id LEFT JOIN wp_term_relationships as t3 ON t2.meta_value = t3.object_id LEFT JOIN wp_term_taxonomy
        as t4 ON t3.term_taxonomy_id = t4.term_taxonomy_id LEFT JOIN wp_terms as t5 ON t4.term_id = t5.term_id where
        t1.order_id = '" . $order->get_id() . "' and t1.order_item_type='line_item' and t2.meta_key='_product_id' and
        t4.taxonomy='product_cat' ORDER BY `t5`.`name` ASC" );
         
        $sorted_item_ids     = array();
        
        foreach ( $c1 as $data ) {
            if ( !in_array( $data->order_item_id, $sorted_item_ids ) ) {

                $sorted_item_ids[] = $data->order_item_id;
            }
        }
        if( count($items) > 1 ) {
            $item_categories = $sorted_items_ids = array();
            
            foreach ($items as $item_id => $item) {
  
      // Get the product category(ies) term(s) name(s) - (array)
        $term_ids = wp_get_post_terms( $item->get_product_id(), 'product_cat', array('fields' => 'ids') );

            }

            foreach ( $term_ids as $term ) {
            // Categories by slug
             $product_cat_id= $term->id;
            }
            $item_categories[$product_cat_id] = $item_id;
        } 
        
        $query = new WP_Query( array(
       'posts_per_page'  =>  -1,
       'post_type'       =>  array( 'shop_order' ), // <== HERE MISSING
    ) );
   

    // Loop in the Query
  
            // Get the post ID
             $post_id = $query->post->ID;

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

            // Get the new sorted array of items
            $sorted_items_ids[$item_id] = $items[$item_id];

    wp_reset_query();

    return $sorted_items_ids;
}

任何帮助都将不胜感激!!提前谢谢

您能否尝试将WP_查询中的
orderby
更改为
product_cat
,而不是
菜单_order
?是的,但不提供结果谢谢您!我尝试了不同的变体,包括代码片段中的代码,但不幸的是仍然不起作用。我甚至没有收到错误,只是什么也没有发生:(更新我更新了代码,它给出了正确的第一个结果@Бааааааааааааааааааааа1072
add_filter( 'woocommerce_order_get_items', 'filter_order_get_items_by_categories12', 10, 3 );

function filter_order_get_items_by_categories12( $items, $order ) {
    global $woocommerce, $wpdb;

    $c1 = $wpdb->get_results( "select t1.order_item_name,t1.order_item_id,t5.name,t2.meta_value from
        wp_woocommerce_order_items as t1 LEFT JOIN wp_woocommerce_order_itemmeta as t2 ON t1.order_item_id =
        t2.order_item_id LEFT JOIN wp_term_relationships as t3 ON t2.meta_value = t3.object_id LEFT JOIN wp_term_taxonomy
        as t4 ON t3.term_taxonomy_id = t4.term_taxonomy_id LEFT JOIN wp_terms as t5 ON t4.term_id = t5.term_id where
        t1.order_id = '" . $order->get_id() . "' and t1.order_item_type='line_item' and t2.meta_key='_product_id' and
        t4.taxonomy='product_cat' ORDER BY `t5`.`name` ASC" );

    $sorted_item_ids = array();

    foreach ( $c1 as $data ) {
        if ( !in_array( $data->order_item_id, $sorted_item_ids ) ) {

            $sorted_item_ids[] = $data->order_item_id;
        }
    }
    $sorete_arr = [];
    foreach ( $sorted_item_ids as $value ) {
        if ( $items[ $value ] instanceof WC_Order_Item_Product )
            $sorete_arr[ $value ] = $items[ $value ];
    }



    return ($sorete_arr) ? $sorete_arr : $items;
}
add_filter( 'woocommerce_order_get_items', 'filter_order_get_items_by_categories12', 10, 3 );

function filter_order_get_items_by_categories12( $items, $order ) {
    global $woocommerce, $wpdb;

    $c1 = $wpdb->get_results( "select t1.order_item_name,t1.order_item_id,t5.name,t2.meta_value from
        wp_woocommerce_order_items as t1 LEFT JOIN wp_woocommerce_order_itemmeta as t2 ON t1.order_item_id =
        t2.order_item_id LEFT JOIN wp_term_relationships as t3 ON t2.meta_value = t3.object_id LEFT JOIN wp_term_taxonomy
        as t4 ON t3.term_taxonomy_id = t4.term_taxonomy_id LEFT JOIN wp_terms as t5 ON t4.term_id = t5.term_id where
        t1.order_id = '" . $order->get_id() . "' and t1.order_item_type='line_item' and t2.meta_key='_product_id' and
        t4.taxonomy='product_cat' ORDER BY `t5`.`name` ASC" );

    $sorted_item_ids = array();

    foreach ( $c1 as $data ) {
        if ( !in_array( $data->order_item_id, $sorted_item_ids ) ) {

            $sorted_item_ids[] = $data->order_item_id;
        }
    }
    $sorete_arr = [];
    foreach ( $sorted_item_ids as $value ) {
        if ( $items[ $value ] instanceof WC_Order_Item_Product )
            $sorete_arr[ $value ] = $items[ $value ];
    }



    return ($sorete_arr) ? $sorete_arr : $items;
}