
本文详解如何在 wordpress 网站中从所有订阅者中**真正随机选取 20 人**并展示其头像,解决 `get_users()` 默认不支持 `orderby => 'rand'` 的限制,提供可直接部署的两步查询方案。
在 WordPress 开发中,get_users() 函数虽强大,但其原生参数并不支持 orderby => 'rand'(该参数仅对 WP_Query 有效,对用户查询无效)。因此,若你希望从全部订阅用户中真正随机抽取固定数量(如 20 人),而非按注册时间、用户名等顺序截取前 20 名,就必须采用分步策略:先获取所有订阅者 ID,再从中随机采样,最后按 ID 批量拉取完整用户数据。
以下是推荐的三段式实现方案,兼顾性能、可读性与兼容性(适用于 WordPress 4.0+):
✅ 步骤一:获取全部订阅者 ID 列表
使用 'fields' => 'ID' 参数极大提升查询效率——仅返回用户 ID,避免加载冗余字段(如 user_login、user_email 等),尤其当订阅者数量较大时效果显著:
'subscriber',
'fields' => 'ID'
);
$user_ids = get_users($args); // 返回索引数组,如 [101, 205, 337, ...]✅ 步骤二:随机抽取 20 个 ID 并查询用户详情
利用 PHP 原生函数 array_rand() 从 $user_ids 中无放回随机选取 20 个键名,再通过 'include' 参数精准拉取对应用户数据。注意:array_rand() 返回的是键(key),需用 array_values() 提取值,或直接用于 include(因 get_users() 的 include 接受数值数组):
// 随机选取最多 20 个 ID(若订阅者不足 20 人,则返回全部)
$random_keys = array_rand($user_ids, min(20, count($user_ids)));
$random_ids = array_values(array_intersect_key($user_ids, array_flip($random_keys)));
// 查询这 20 个用户的完整信息
$args = array(
'include' => $random_ids,
'orderby' => 'user_nicename',
'order' => 'ASC'
);
$random_users = get_users($args);⚠️ 关键注意事项: 若订阅用户总数 少于 20 人,array_rand() 会触发警告。上述 min(20, count(...)) 可安全兜底; array_rand() 返回的是原数组的键名,而 $user_ids 是索引数组(键为 0,1,2...),因此可直接用 array_values() 转换为纯数值 ID 数组; 'include' 参数会自动忽略不存在的 ID,无需额外校验。
✅ 步骤三:渲染头像列表
最终遍历 $random_users 输出头像。建议使用 $user->ID(而非 $user->user_email)调用 get_avatar(),更可靠且支持本地头像缓存:
- ID, 96); ?>
? 进阶优化建议
- 缓存随机结果:对高流量站点,可将 $random_ids 存入 Transient(如 set_transient('random_subscribers', $random_ids, HOUR_IN_SECONDS)),每小时刷新一次,降低数据库压力;
- 添加备用排序:若需视觉上更“随机”,可在最终输出前用 usort() 对 $random_users 按 rand() 二次打乱(但通常非必需);
-
错误处理:增加 if (empty($random_users)) { echo '
暂无订阅用户
'; } 提升健壮性。
此方案彻底规避了 SQL 层面的 ORDER BY RAND() 性能陷阱(全表扫描),以两次轻量级查询达成高效、可控的随机展示目标,是 WordPress 用户随机化展示的最佳实践。










