核心原理
DedeCMS 的登录状态信息主要存储在 PHP 的 $_SESSION 全局变量中,当你成功登录后,系统会在 $_SESSION 中写入一些特定的键值对来标记你的身份和权限,我们调用的过程,本质上就是读取和判断这些 $_SESSION 变量的过程。

(图片来源网络,侵删)
使用内置标签 {dede:php} 和 global (最常用、最灵活)
这是最推荐的方法,因为它非常灵活,可以在模板的任何位置执行 PHP 代码,直接访问 $_SESSION。
判断用户是否已登录
如果你只想判断用户是否登录,而不关心具体是谁,可以使用以下代码:
{dede:php}
// 引入全局对象,这是访问 $_SESSION 的前提
global $_SESSION;
// 检查关键的登录状态变量 'userid' 是否存在
// DedeCMS 登录成功后,会设置 $_SESSION['userid']
if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) {
echo '<a href="/member/">会员中心</a>';
echo ' | ';
echo '<a href="/member/index_do.php?fmdo=login&dopost=exit">退出登录</a>';
} else {
echo '<a href="/member/index.php">登录</a>';
echo ' | ';
echo '<a href="/member/reg.php">注册</a>';
}
{/dede:php}
代码解释:
{dede:php}...{/dede:php}: 这是 DedeCMS 的一个特殊标签,允许在模板中直接编写 PHP 代码。global $_SESSION;: 必须要有,在模板中直接使用$_SESSION是不行的,需要先将其声明为全局变量。isset($_SESSION['userid']): 检查$_SESSION中是否存在名为userid的键,如果存在,说明用户已登录。$_SESSION['userid'] > 0: 一个额外的判断,确保userid是一个有效的数字,而不是 0 或其他值。
获取并显示当前登录用户的信息
如果你想获取当前登录用户的用户名、昵称、UID 等信息,可以访问 $_SESSION 中对应的键。

(图片来源网络,侵删)
常用 $_SESSION 键值:
$_SESSION['userid']: 用户的数字ID。$_SESSION['mtype']: 用户类型 (如个人、企业等)。$_SESSION['uid']: 有时和userid相同,也是用户ID。$_SESSION['username']: 用户的登录名。$_SESSION['uname']: 用户的昵称/显示名称。$_SESSION['adminid']: 如果是管理员登录,这个值会有意义。
示例代码:
{dede:php}
global $_SESSION;
// 判断是否登录
if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) {
// 已登录,显示用户信息
$uid = $_SESSION['userid'];
$username = $_SESSION['username'];
$uname = $_SESSION['uname'];
echo "欢迎您, <strong>" . $uname . "</strong> (ID: " . $uid . ")<br>";
echo "登录名: " . $username . "<br>";
// 退出链接
echo '<a href="/member/index_do.php?fmdo=login&dopost=exit">安全退出</a>';
} else {
// 未登录,显示登录和注册链接
echo '<a href="/member/index.php">请登录</a>';
echo ' | ';
echo '<a href="/member/reg.php">免费注册</a>';
}
{/dede:php}
在自定义函数或文件中调用
如果你想在 PHP 文件(如 index.php)或者自定义的函数文件中判断登录状态,过程更直接,不需要 global 声明。
示例 (在 index.php 文件中):

(图片来源网络,侵删)
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php"); // 引入核心文件
// 直接判断 $_SESSION
if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) {
// 用户已登录逻辑
$dsql->SetQuery("SELECT uname FROM `dede_member` WHERE userid = '{$_SESSION['userid']}'");
$dsql->Execute();
$row = $dsql->GetArray();
$welcome_info = "欢迎您, " . $row['uname'];
} else {
// 用户未登录逻辑
$welcome_info = "您尚未登录,请先登录!";
}
// ... 后续模板赋值和解析
$tpl->assign('welcome_info', $welcome_info);
$tpl->Display('index.htm');
?>
通过修改或扩展 DedeCMS 标签 (高级用法)
如果你想让调用变得更像 DedeCMS 的原生标签({dede:loginstatus}),你可以修改 include/extend.func.php 文件来创建一个自定义函数。
步骤:
-
打开
/include/extend.func.php文件,在文件末尾添加以下函数:/** * 获取当前登录用户信息 * @param string $field 要获取的字段 (如 'userid', 'username', 'uname') * @return string 返回字段值或空字符串 */ function GetMemberInfo($field = '') { global $_cfg, $_SESSION; // 确保会话已启动 if (!isset($_SESSION)) { session_start(); } if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) { if ($field == '') { return "已登录"; } return isset($_SESSION[$field]) ? $_SESSION[$field] : ''; } return ''; } -
在你的模板文件中,就可以这样使用:
-
判断是否登录:
{dede:php} if (GetMemberInfo('userid') != '') { echo '已登录'; } else { echo '未登录'; } {/dede:php}或者更简单地:
{dede:php}echo GetMemberInfo() != '' ? '已登录' : '未登录';{/dede:php} -
获取用户昵称:
欢迎,{dede:php}echo GetMemberInfo('uname');{/dede:php}! -
获取用户ID:
您的ID是:{dede:php}echo GetMemberInfo('userid');{/dede:php}
-
这种方法让模板更整洁,但本质上还是对方法一的封装。
总结与最佳实践
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:php} |
最灵活、最直接,功能强大,无需修改核心文件。 | 模板中 PHP 代码稍显杂乱。 | 绝大多数情况下的首选,尤其是在模板中需要复杂逻辑时。 |
| PHP文件中 | 逻辑清晰,适合在 PHP 后端处理。 | 不在模板中直接展示。 | 在 PHP 控制器文件中处理登录逻辑,然后将结果传递给模板。 |
| 扩展函数 | 模板代码简洁,更像原生标签。 | 需要修改 extend.func.php 文件。 |
当需要在多个模板中重复使用登录状态逻辑,且希望代码更“模板化”时。 |
推荐:
对于绝大多数 DedeCMS 掌握和使用方法一 ({dede:php}) 就足够应对所有关于登录状态调用的需求了,它简单、有效且不破坏系统文件。
