
本文详解 wordpress 中 `get_user_meta()` 返回值看似“错误”的常见原因——实际多因条件判断中误用赋值运算符 `=` 而非比较运算符 `==` 或 `===`,导致逻辑恒为真、元数据未被正确校验。
在 WordPress 开发中,使用 get_user_meta() 获取用户自定义字段(如 Formidable Forms 创建的 'info' 元数据)是常见操作。但若后续逻辑(如登录后跳转)始终不按预期执行,首要排查点往往是 PHP 条件语句中的运算符误用。
您提供的代码中存在两个关键语法错误:
if ($loggedin == true && $info = 'no') { ... } // ❌ 错误:= 是赋值,不是比较!
else if ($loggedin == true && $info = 'yes') { ... } // ❌ 同样错误此处 = 会将字符串 'no' 赋值给变量 $info,并返回该值(非空字符串在布尔上下文中为 true),因此整个条件恒为 true,无论原始元数据实际为何值。这正是您观察到“总是返回 'no'”的根源——并非 get_user_meta() 返回错误,而是代码覆盖了原值并强制进入第一个分支。
✅ 正确写法应使用严格相等比较 ===(推荐)或松散相等 ==:
function my_logged_in_redirect() {
// 仅在目标页面(ID 1795)执行,避免全站触发
if (!is_page(1795)) {
return;
}
if (!is_user_logged_in()) {
wp_redirect(home_url());
exit;
}
$user_id = get_current_user_id();
$info = get_user_meta($user_id, 'info', true);
// 使用严格比较,避免类型隐式转换干扰
if ($info === 'no') {
wp_redirect(home_url('/dashboard/account-information'));
exit;
} elseif ($info === 'yes') {
wp_redirect(home_url('/dashboard'));
exit;
} else {
// 兜底:元数据为空、不存在或非预期值时的安全跳转
wp_redirect(home_url('/dashboard'));
exit;
}
}
add_action('template_redirect', 'my_logged_in_redirect');? 关键改进说明:
- ✅ 用 === 替代 =,确保语义正确且类型安全;
- ✅ 提前 return 避免非目标页面执行冗余逻辑;
- ✅ 将 is_user_logged_in() 检查前置,提升可读性与性能;
- ✅ 所有 wp_redirect() 后添加 exit(或 die),防止重定向后继续执行后续代码(WordPress 官方强制要求);
- ✅ 增加 else 兜底分支,应对元数据缺失、空值或异常情况,增强健壮性。
? 调试建议:
若仍不确定元数据实际值,可在开发环境临时加入日志验证:
error_log("User ID: {$user_id}, 'info' meta = " . var_export($info, true));查看 PHP 错误日志即可确认真实存储值。
总结:get_user_meta() 本身极少出错,绝大多数“值不对”问题源于逻辑层的低级语法疏漏。养成使用 === 比较、重定向后 exit、关键路径加日志的习惯,可大幅降低此类陷阱发生概率。










