为WooCommerce用户列表的订单数列添加排序功能
为WooCommerce后台用户管理的「Orders Placed」列添加排序功能
要给新增的「Orders Placed」列添加排序功能,需要补充两个关键WordPress钩子:一个标记列可排序,另一个处理排序时的数据库查询逻辑。同时可优化原有订单数统计代码,提升后台加载效率。
完整代码(替换/补充原有代码)
// 新增用户列 add_filter( 'manage_users_columns', 'add_new_user_column' ); function add_new_user_column( $columns ) { $columns['placed_order'] = 'Orders Placed'; return $columns; } // 标记列支持排序 add_filter( 'manage_users_sortable_columns', 'make_placed_order_column_sortable' ); function make_placed_order_column_sortable( $columns ) { $columns['placed_order'] = 'placed_order'; return $columns; } // 处理排序查询逻辑 add_action( 'pre_get_users', 'sort_placed_order_column' ); function sort_placed_order_column( $query ) { if ( ! is_admin() || ! $query->is_main_query() ) return; $orderby = $query->get( 'orderby' ); if ( 'placed_order' === $orderby ) { global $wpdb; // 关联订单元数据与订单表,匹配用户ID $query->join .= " LEFT JOIN {$wpdb->postmeta} AS order_meta ON {$wpdb->users}.ID = order_meta.meta_value AND order_meta.meta_key = '_customer_user' LEFT JOIN {$wpdb->posts} AS orders ON order_meta.post_id = orders.ID AND orders.post_type IN ('" . implode( "','", wc_get_order_types() ) . "') AND orders.post_status IN ('" . implode( "','", array_keys( wc_get_order_statuses() ) ) . "') "; // 按用户分组,以订单统计数排序 $query->groupby = "{$wpdb->users}.ID"; $query->orderby = "COUNT(orders.ID) " . $query->get( 'order', 'DESC' ); } } // 显示列内容(优化查询效率) add_filter( 'manage_users_custom_column', 'add_new_user_column_content', 10, 3 ); function add_new_user_column_content( $content, $column, $user_id ) { if ( 'placed_order' === $column ) { global $wpdb; // 直接查询数据库统计有效订单数,替代get_posts提升效率 $order_count = $wpdb->get_var( $wpdb->prepare( " SELECT COUNT(DISTINCT orders.ID) FROM {$wpdb->posts} AS orders LEFT JOIN {$wpdb->postmeta} AS order_meta ON orders.ID = order_meta.post_id WHERE order_meta.meta_key = '_customer_user' AND order_meta.meta_value = %d AND orders.post_type IN ('" . implode( "','", wc_get_order_types() ) . "') AND orders.post_status IN ('" . implode( "','", array_keys( wc_get_order_statuses() ) ) . "') ", $user_id ) ); $content = $order_count ? $order_count : 0; } return $content; }
代码说明
- 标记可排序列:通过
manage_users_sortable_columns钩子,将placed_order列注册为可排序列,点击列标题即可触发排序。 - 处理排序查询:使用
pre_get_users钩子修改用户查询逻辑,关联订单表与订单元数据表,按用户ID分组后统计订单数量,实现按订单数升序/降序排序。 - 优化统计效率:替换原有
get_posts方式为直接数据库查询,避免加载大量冗余订单数据,提升后台用户列表的加载速度。
内容的提问来源于stack exchange,提问作者rainelement23
相关产品推荐
相关产品推荐

