
本文详解 wordpress 中 `get_user_meta()` 返回错误值的典型原因,重点指出赋值运算符 `=` 误用为比较运算符 `==` 导致逻辑始终为真,进而引发重定向失效,并提供完整、健壮的登录后跳转解决方案。
在 WordPress 开发中,使用 get_user_meta() 获取用户自定义字段(如 Formidable Forms 创建的 'info' 元数据)是常见操作。但如您所遇问题——代码始终读取到 'no',即使后台已更新为 'yes'——根本原因往往不在数据本身,而在 PHP 条件判断中的语法错误。
最典型的错误出现在您的条件语句中:
if ($loggedin == true && $info = 'no') { ... }此处的 $info = 'no' 是赋值操作(assignment),而非相等比较(comparison)。PHP 会先将字符串 'no' 赋值给 $info,再返回该值(非空字符串在布尔上下文中为 true),导致整个条件恒为真。同理,$info = 'yes' 同样执行赋值,而非判断。
✅ 正确写法必须使用严格比较运算符 ===(推荐)或松散比较 ==:
if ($loggedin && $info === 'no') { ... }
elseif ($loggedin && $info === 'yes') { ... }此外,原始代码存在多个可优化点。以下是经过加固的生产就绪版本:
function my_logged_in_redirect() {
// 仅对已登录用户且访问特定页面时执行(避免全站拦截)
if (!is_page(1795) || !is_user_logged_in()) {
return;
}
$user_id = get_current_user_id();
// 显式指定 $single = true,确保返回字符串而非数组
$info = get_user_meta($user_id, 'info', true);
// 安全兜底:若 meta 不存在或为空,视为未填写
if (empty($info)) {
$info = 'no';
}
// 使用严格比较,避免类型隐式转换导致意外行为
if ($info === 'no') {
wp_redirect(home_url('/dashboard/account-information'));
exit;
} elseif ($info === 'yes') {
wp_redirect(home_url('/dashboard'));
exit;
}
}
add_action('template_redirect', 'my_logged_in_redirect');⚠️ 关键注意事项:
- 务必调用 exit 或 die:wp_redirect() 仅发送 HTTP 头,不终止脚本执行;遗漏会导致后续代码运行甚至报错“headers already sent”。
- 避免重复重定向:确保该逻辑不与其他插件或主题的重定向规则冲突(例如检查 wp_doing_ajax() 或排除后台请求)。
- 元数据缓存问题:若更新后仍不生效,可临时添加 wp_cache_delete($user_id, 'users') 清除用户对象缓存(生产环境慎用,建议优先排查赋值错误)。
-
调试技巧:开发阶段可加入日志辅助验证:
error_log("User ID: {$user_id}, info meta: '" . var_export($info, true) . "'");
综上,get_user_meta() 本身极少“返回错误值”——绝大多数情况是逻辑判断被意外篡改。修正 = → ===,补充安全校验与脚本终止,即可稳定实现用户资料完善引导流程。










