本文介绍如何用单次 foreach 循环替代重复的条件判断代码,高效获取多角色用户列表,避免冗余函数定义与变量作用域问题,提升 wordpress ajax 处理逻辑的可维护性与性能。
在 WordPress AJAX 开发中,常见需求是根据插件设置动态筛选并返回特定用户角色(如 administrator、editor、author 等)的显示名称。初学者常采用「为每个角色写一段独立 if 判断」的方式,导致代码冗长、难以维护。例如:
$user_roles = get_option('show_users');
$count = 0;
$result = []; // 注意:必须初始化,否则 PHP 7.4+ 会报错
if ($user_roles['administrator']) {
$users = get_users(['role' => 'adminis
trator']);
foreach ($users as $user) {
$result[$count++] = $user->display_name;
}
}
if ($user_roles['editor']) {
$users = get_users(['role' => 'editor']);
foreach ($users as $user) {
$result[$count++] = $user->display_name;
}
}
// ……重复至所有角色这种写法不仅重复度高,还容易因遗漏角色或拼写错误引发 Bug。
由于 $user_roles 本身就是一个关联数组(键为角色名,值为布尔开关),我们无需手动枚举每个角色,更不必封装成函数——只需一次 foreach 即可完*部逻辑:
$user_roles = get_option('show_users');
$result = []; // 必须显式声明,避免未定义变量警告
$count = 0;
foreach ($user_roles as $role => $enabled) {
if ($enabled && !empty($role)) { // 安全校验:确保启用且角色名非空
$users = get_users(['role' => $role]);
foreach ($users as $user) {
$result[] = $user->display_name; // 推荐使用 [] 自动追加,替代 $count 手动计数
}
}
}
// 最终返回 JSON 响应(AJAX 回调中)
wp_send_json($result);你尝试的 save_time() 函数无法正常工作,根本原因在于 PHP 函数作用域隔离:
即使强行添加 global $user_roles, $result, $count;,也违背了函数封装原则,易引发副作用,不推荐用于生产环境。
若需保持结构化输出(如按角色分组),可进一步优化:
$user_roles = get_option('show_users');
$result = [];
foreach ($user_roles as $role => $enabled) {
if ($enabled) {
$users = get_users(['role' => $role]);
$result[$role] = wp_list_pluck($users, 'display_name'); // 返回该角色所有昵称数组
}
}
wp_send_json($result);这样前端可清晰区分各角色数据,便于渲染不同样式列表。
通过这一重构,代码行数减少 60%+,逻辑一目了然,后续新增角色只需在插件设置中勾选,无需修改 PHP 逻辑——这才是 WordPress 可扩展开发的最佳实践。