WordPress中登录成功后却取法获取用户$user_ID信息

最近网站支持登录功能,但是登录成功后只有管理员可以获取到$user_ID信息,其他角色登录都不行,开启了排查之路!

以下是我尝试过的方法,但是并未解决,仍然无效,最后发现是因为安装了WP Fastest Cache缓存插件,要将【不显示登录用户的缓存版本】这个选项要勾上就解决了!

WordPress中登录成功后却取法获取用户$user_ID信息

如果你不是这个原因,也可以使用如下方法排查下:

WordPress中,$user_ID全局变量获取不到值的问题通常与变量初始化时机或用户状态检测方式有关,而非用户角色(订阅者/管理员)本身的权限差异。以下是具体原因分析和解决方案:

可能的原因

  1. $user_ID全局变量初始化时机问题
    $user_ID是WordPress早期版本遗留的全局变量,其初始化依赖于wp_setup_current_user()函数。在某些场景下(如主题模板加载过早、特定钩子触发顺序),该变量可能尚未被初始化,导致即使用户已登录也无法获取值。
    管理员角色能获取到值可能是巧合(如某些插件/主题对管理员角色提前初始化了用户数据),并非权限差异导致。
  2. 检测用户登录状态的方式不可靠
    直接依赖$user_ID判断登录状态并不稳定。WordPress推荐使用专用函数检测用户状态,而非直接访问全局变量。

解决方案

建议使用WordPress官方推荐的函数替代$user_ID,更可靠且兼容所有用户角色。修改代码如下:

<?php if (io_get_option('nav_login', false)) { 
    // 使用WordPress官方函数检测登录状态
    if (!is_user_logged_in()) { ?>
        <li class="nav-login ml-3 ml-md-4">
            <a href="<?php echo esc_url(wp_login_url(io_get_current_url())); ?>" title="登录">
                <i class="iconfont icon-user icon-lg"></i>
            </a>
        </li>
    <?php } else {
        // 如需获取用户ID,使用wp_get_current_user()
        $current_user = wp_get_current_user();
        $user_id = $current_user->ID; // 可靠获取当前用户ID
        get_template_part('templates/widget/header', 'user');
    }
} ?>

关键改进点

  1. is_user_logged_in()替代$user_ID判断登录状态
    这是WordPress推荐的登录状态检测函数,兼容所有用户角色,不受全局变量初始化时机影响。
  2. wp_get_current_user()获取用户ID
    该函数返回当前登录用户的对象,通过->ID可稳定获取用户ID,适用于任何用户角色(包括订阅者)。

额外排查建议

如果问题仍存在,可能是主题/插件冲突导致用户状态异常:

  1. 暂时禁用所有插件,测试是否恢复正常;
  2. 切换到默认主题(如Twenty Twenty-Three),排查是否为当前主题的代码问题;
  3. 检查是否有自定义代码(如functions.php中)修改了用户初始化流程。

通过上述方法,可确保在任何用户角色下都能稳定检测登录状态和获取用户ID。

© 版权声明

相关文章

暂无评论

暂无评论...