Php WooCommerce按类别对订单项目进行排序
{UPDATE} 我想按类别菜单顺序对后端订单详细信息上的产品进行排序。所以我的分类是服装、装饰、音乐,产品必须以这种方式订购 我试着用这个片段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
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;
}