You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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;
}

代码说明

  1. 标记可排序列:通过manage_users_sortable_columns钩子,将placed_order列注册为可排序列,点击列标题即可触发排序。
  2. 处理排序查询:使用pre_get_users钩子修改用户查询逻辑,关联订单表与订单元数据表,按用户ID分组后统计订单数量,实现按订单数升序/降序排序。
  3. 优化统计效率:替换原有get_posts方式为直接数据库查询,避免加载大量冗余订单数据,提升后台用户列表的加载速度。

内容的提问来源于stack exchange,提问作者rainelement23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:43:14