
本文详解如何修复 wordpress 中因误用赋值运算符 `=` 替代比较运算符 `==` 导致 `get_user_meta()` 判断失败的问题,并提供健壮、安全的登录后重定向逻辑。
在 WordPress 开发中,使用 get_user_meta() 获取用户自定义字段(如 Formidable Forms 创建的 'info' 元数据)是常见操作。但一个极易被忽视的语法陷阱——将比较运算符 == 错写为赋值运算符 = ——会导致条件判断永远为真,进而引发逻辑错乱(例如本例中始终重定向到 /dashboard/account-information,即使数据库中 info 值已是 'yes')。
你的原始代码中存在两处关键错误:
if ($loggedin == true && $info = 'no') { ... } // ❌ 错误:= 是赋值,不是比较!
else if ($loggedin == true && $info = 'yes') { ... } // ❌ 同样错误这段代码实际执行的是:每次进入条件分支时,都将字符串 'no' 或 'yes' 赋值给 $info 变量,而 PHP 中非空字符串赋值表达式本身返回该字符串(即“truthy”值),因此整个条件恒为 true,造成逻辑失控。
✅ 正确写法应统一使用严格相等比较 ===(推荐)或宽松比较 ==:
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();
// 显式指定 $single = true,确保返回字符串而非数组
$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 {
// 兜底处理:meta 不存在、为空或非预期值时,导向默认仪表盘
wp_redirect(home_url('/dashboard'));
exit;
}
}
add_action('template_redirect', 'my_logged_in_redirect');? 重要注意事项:
- ✅ 务必在 wp_redirect() 后调用 exit 或 die:WordPress 不会自动终止脚本,遗漏会导致“headers already sent”错误或后续代码意外执行;
- ✅ 优先使用 === 而非 ==:防止 '0' == false 或 '' == 0 等 PHP 类型转换引发的误判;
- ✅ 添加兜底逻辑:get_user_meta() 在字段不存在时返回 ''(空字符串)或 false,不可假设值一定为 'yes'/'no';
- ✅ 避免重复检查 is_user_logged_in():函数本身已做登录态校验,无需再与 true 比较(if (is_user_logged_in()) 更简洁可靠);
- ✅ 建议使用 wp_safe_redirect() 替代 wp_redirect():增强 URL 安全性,尤其当路径含动态参数时。
? 调试小技巧:
临时添加日志确认实际值(生产环境请移除):
error_log("User ID: {$user_id}, info meta = '" . print_r($info, true) . "'");配合浏览器开发者工具 → Network 标签页,观察重定向链路,可快速定位问题源头。
通过修正运算符、强化健壮性与遵循 WordPress 最佳实践,即可确保用户元数据驱动的业务逻辑(如资料补全引导)稳定、准确地运行。










