按角色列出用户并统计分配文章数(ACF用户字段),代码求指导
按角色展示用户及分配文章数的修正方案
你的现有代码逻辑存在问题,无法将文章数量对应到单个用户。正确的做法是遍历指定角色的用户,逐个统计每个用户被分配的文章数量,具体实现如下:
1. 获取目标角色用户列表
这部分你的代码是正确的,先获取所有um_pds-project-manager角色的用户:
$args_user_role = array( 'role' => 'um_pds-project-manager', 'orderby' => 'user_nicename', 'order' => 'ASC' ); $users = get_users( $args_user_role );
2. 遍历用户并统计对应文章数
ACF单选用户字段默认存储用户ID,针对每个用户单独查询匹配的文章:
foreach ( $users as $user ) { // 仅查询文章ID以提升性能 $assigned_projects = get_posts( array( 'posts_per_page' => -1, 'post_type' => 'project', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'status', 'value' => '1' ), array( 'key' => 'pds_project_manager', 'value' => $user->ID, 'compare' => '=' // 单选用户字段用精确匹配 ) ), 'fields' => 'ids' ) ); // 输出用户信息与文章数量 echo '<div class="project-manager-item">'; echo '<h4>' . esc_html( $user->display_name ) . '</h4>'; echo '<p>已分配项目数:' . count( $assigned_projects ) . '</p>'; echo '</div>'; }
关键修正说明
- 原代码直接将用户数组传入
meta_query,无法关联单个用户与文章,必须遍历用户逐个查询 - 单选ACF用户字段存储的是纯用户ID,用
compare='='比LIKE更精准且性能更优 - 使用
fields => 'ids'只返回文章ID数组,避免加载完整文章对象,提升查询效率
多选用户字段适配
如果你的ACF用户字段是多选类型(存储逗号分隔的带引号ID字符串),需调整meta_query:
array( 'key' => 'pds_project_manager', 'value' => '"' . $user->ID . '"', 'compare' => 'LIKE' )
内容的提问来源于stack exchange,提问作者Webbb
相关产品推荐
相关产品推荐

