本文详解 wordpress 中 `get_user_meta()` 返回错误值的典型原因,重点指出赋值运算符 `=` 误用为比较运算符 `==` 导致逻辑始终为真,进而引发重定向失效,并提供完整、健壮的登录后跳转解决方案。
在 WordPress 开发中,使用 get_user_meta() 获取用户自定义字段(如 Formidable Fo
rms 创建的 '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');⚠️ 关键注意事项:
error_log("User ID: {$user_id}, info meta: '" . var_export($info, true) . "'");综上,get_user_meta() 本身极少“返回错误值”——绝大多数情况是逻辑判断被意外篡改。修正 = → ===,补充安全校验与脚本终止,即可稳定实现用户资料完善引导流程。