WordPress 用户元数据判断失效:赋值符误用导致重定向逻辑错误

本文详解 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、关键路径加日志的习惯,可大幅降低此类陷阱发生概率。