本文详解如何修复 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');? 重要注意事项:
ready sent”错误或后续代码意外执行; ? 调试小技巧:
临时添加日志确认实际值(生产环境请移除):
error_log("User ID: {$user_id}, info meta = '" . print_r($info, true) . "'");配合浏览器开发者工具 → Network 标签页,观察重定向链路,可快速定位问题源头。
通过修正运算符、强化健壮性与遵循 WordPress 最佳实践,即可确保用户元数据驱动的业务逻辑(如资料补全引导)稳定、准确地运行。