遍历指定角色用户时ACF字段统计脚本失效求助
问题解决思路
核心问题:循环结构错误
你的代码里foreach ($users as $user)后面没有添加花括号{},这导致只有紧跟的$user_id= $user->ID;这一行属于循环体,后续的查询、统计、更新逻辑都在循环外部,只会执行一次,而且仅使用最后一个遍历到的用户ID来处理,自然无法为每个用户更新统计值。
修复后的完整代码
add_action( 'run_snippet_hourly', function () { $user_query = array( 'role' => 'um_pds-project-manager', 'orderby' => 'display_name', 'order' => 'ASC' ); $users = get_users( $user_query ); if ( !empty( $users ) ) { foreach ( $users as $user ) { // 添加左花括号,标记循环体开始 $user_id = $user->ID; $args = 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' => '=' // 建议替换LIKE为=,避免误匹配相似ID ) ) ); $posts_pm = get_posts($args); $pds_project_manager_count = count($posts_pm); // 更新用户统计字段 update_user_meta( $user_id, 'user_project_count', $pds_project_manager_count); } // 添加右花括号,闭合foreach循环 } } );//end Cron
额外优化建议
- 替换
compare规则:ACF单选用户字段存储的是纯数字ID,用LIKE会出现误匹配(比如ID=3会匹配ID=13、33等),改用=能实现精准匹配。 - 若
pds_project_manager是多选用户字段,需将compare改为IN,同时value传入数组格式,但你的单ID测试正常,说明是单选字段,用=即可。
内容的提问来源于stack exchange,提问作者Webbb
相关产品推荐
相关产品推荐

